У меня есть таблица с именем Объявления, в которой содержится ~ 441 000 строк и 21 столбец.SQL-запрос занимает очень много времени
Я пытаюсь выполнить следующий запрос:
SELECT Ads.* FROM Ads WHERE Ads.countries_CountryId = 'FR'
Я поставил индекс, в поле countries_CountryId, который имеет тип char(2)
, но когда я запускаю выше запрос, он занимает около 5 -8 секунд. Это количество времени для меня очень велико, для такой таблицы среднего размера и такого простого SQL-запроса. Где я должен искать проблему? Или это нормально, когда такой запрос занимает так много времени?
Я также попытался EXPLAIN
приведенный выше запрос и получить следующие результаты, но я не знаю, как расшифровать это :(
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Ads ref countries_CountryId countries_CountryId 2 const 24368 Using where
EDIT1: (ответ на Сета McClaine)
Я попробовал ваше предложение, то, как вы предложили, возвращает ошибку, но если я бегу SELECT count(*) FROM Ads WHERE Ads.countries_CountryId = 'FR'
, он работает гораздо быстрее: 0,0052490234375
но проблема в том, что я не для печати ИНГ что-нибудь, я использую PHP для выполнения запросов и вычисления их выполнения на данный момент, и в конце концов, выводит запросы работать, и время, которое они взяли:
Array
(
[0] => Array
(
[query] => SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'
[duration] => 0.00481009483337
)
[1] => Array
(
[query] => SELECT * FROM Countries WHERE NameFormatted LIKE '%FRANCE%'
[duration] => 0.00234889984131
)
[2] => Array
(
[query] => SELECT Ads.* FROM Ads WHERE Ads.countries_CountryId = 'FR'
[duration] => 4.71820402145
)
[3] => Array
(
[query] => SELECT COUNT(*) FROM Ads WHERE Ads.countries_CountryId = 'FR'
[duration] => 0.0052490234375
)
)
Вот также фрагмент кода, который запускает запросы:
public function query($query, $cacheit=true) {
if (!$this->isConnected()) {
$this->throwError("Querying <b>".$query."</b> failed, because MySQL is not connected!", self::MYSQL_NOT_CONNECTED, false);
return false;
}
$qstart=microtime(true);
[email protected]_query($query, $this->conn_resource);
$qduration=microtime(true) - $qstart;
if ($result===FALSE) $this->throwError("Querying <b>".$query."</b> failed!", self::MYSQL_QUERY_ERR);
$this->numQueries++;
$this->executedQueries[] = array(
'query' => $query,
'duration' => $qduration
);
return $result;
}
Возможно, это не тот запрос, который может быть собственным, может быть несколько других вещей, которые могут способствовать медленному ответу на выход. Например, каковы спецификации машины, на которой находится БД? Существуют ли другие одновременные (и, возможно, интенсивные процессы) задания/процессы, которые выполняются одновременно? – RizJa
Его взгляд прекрасный, просто для тестирования, используйте два запроса, в ist, выберите MAX, MIN первичный идентификатор по этим критериям, а затем выберите записи между MIN и MAX-идентификаторами. – devpro
Если вы печатаете, это может быть фактическая печать, которая длится так долго ... Попробуйте выполнить 'SELECT count (Объявления. *) FROM Объявления WHERE Ads.countries_CountryId = 'FR'' и посмотрите, увеличивается ли ваша скорость значительно –