2015-12-17 9 views
4

У меня есть таблица с именем Объявления, в которой содержится ~ 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; 
} 
+2

Возможно, это не тот запрос, который может быть собственным, может быть несколько других вещей, которые могут способствовать медленному ответу на выход. Например, каковы спецификации машины, на которой находится БД? Существуют ли другие одновременные (и, возможно, интенсивные процессы) задания/процессы, которые выполняются одновременно? – RizJa

+0

Его взгляд прекрасный, просто для тестирования, используйте два запроса, в ist, выберите MAX, MIN первичный идентификатор по этим критериям, а затем выберите записи между MIN и MAX-идентификаторами. – devpro

+4

Если вы печатаете, это может быть фактическая печать, которая длится так долго ... Попробуйте выполнить 'SELECT count (Объявления. *) FROM Объявления WHERE Ads.countries_CountryId = 'FR'' и посмотрите, увеличивается ли ваша скорость значительно –

ответ

0

Попробуйте выполнить запрос в режиме только для чтения? Как описано here в документации mysql. Вы можете попробовать начать свой запрос с

START TRANSACTION READ ONLY 

Кроме того, вы можете попробовать использовать объяснить заявление, чтобы получить больше информации о вашем запросе.

EXPLAIN SELECT Ads.* FROM .... 

Надеюсь, это поможет. Помогли мне в нескольких больших запросах.

Смежные вопросы