Почему мой запрос медленнее, если столбец даты находится в части SELECT моего запроса? - PullRequest
2 голосов
/ 24 марта 2012

У меня странное поведение с моим MySQL запросом ниже:

SELECT domain_id, domain_name, domain_lastupdate 
FROM   domains 
WHERE  domain_id > 300000 LIMIT 2000

занимает ~ 15 секунд ...

, в то время как

SELECT domain_id, domain_name 
FROM   domains 
WHERE  domain_id > 300000 LIMIT 2000

занимает ~ 0,05 секунды..

Я пробовал разные идентификаторы с разными ограничениями, делая один перед другим, и наоборот, чтобы не получить кэшированные результаты, но я получаю резкие различия во времени.

У меня есть1 индекс для domain_id, 1 для domain_name, но ни один с обоими столбцами ...

Я просто не понимаю ...

#

domain_lastupdate - это простой столбец Date.

Вот вывод EXPLAIN обоих запросов:

explain SELECT domain_id, domain_name, domain_lastupdate FROM domains WHERE domain_id > 255000 LIMIT 500;
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+-------------+
| id | select_type | table   | type  | possible_keys | key         | key_len | ref  | rows     | Extra       |
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+-------------+
|  1 | SIMPLE      | domains | range | UN_domainid   | UN_domainid | 4       | NULL | 12575357 | Using where |
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+-------------+
1 row in set (0.00 sec)

второй:

explain SELECT domain_id, domain_name FROM domains WHERE domain_id > 255000 LIMIT 500;
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+--------------------------+
| id | select_type | table   | type  | possible_keys | key         | key_len | ref  | rows     | Extra                    |
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+--------------------------+
|  1 | SIMPLE      | domains | range | UN_domainid   | UN_domainid | 4       | NULL | 12575369 | Using where; Using index |
+----+-------------+---------+-------+---------------+-------------+---------+------+----------+--------------------------+
1 row in set (0.01 sec)

Есть идеи, почему первый не использует индекс?

1 Ответ

4 голосов
/ 24 марта 2012

Когда вы извлекаете не датированные столбцы, которые вы проиндексировали, SQL Server может извлекать ваши данные непосредственно из индекса и вообще не нужно переходить к таблице.Чтобы получить дату, она должна попасть в таблицу.Добавьте индекс в столбце даты.

Также, я полагаю, вы можете создать многостолбцовый индекс.Убедитесь, что у вас есть domain_id в качестве первого столбца в индексе. Создание индексов

То, что вы хотите использовать, это то, что называется Индекс покрытия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...