2015-10-07 3 views
1

У меня возникли проблемы с пониманием того, почему мой запрос MySQL работает быстрее, когда я меняю его на использование индексов.Почему этот запрос MySQL быстрее без индекса?

Мой первый запрос занимает 0.236s для запуска:

SELECT 
    u.id, 
    u.email, 
    CONCAT(u.first_name, ' ', u.last_name) AS u_name 
FROM 
    tbl_user AS u 
WHERE 
    u.site_id=1 
    AND u.role_id=5 
    AND u.removed_date IS NULL 
ORDER BY 
    u_name ASC 
LIMIT 0, 20 

Мой второй запрос принимает 0.147s для запуска:

SELECT 
    u.id, 
    u.email, 
    CONCAT(u.first_name, ' ', u.last_name) AS u_name 
FROM 
    tbl_user AS u USE INDEX() 
WHERE 
    u.site_id=1 
    AND u.role_id=5 
    AND u.removed_date IS NULL 
ORDER BY 
    u_name ASC 
LIMIT 0, 20 

У меня есть уникальный индекс по имени idx_1 по столбцам site_id, role_id и электронная почта ,

Оператор EXPLAIN сообщает, что он будет использовать idx_1.

+----+-------------+-------+------+-------------------------------------+-------+---------+-------------+-------+----------------------------------------------------+ 
| id | select_type | table | type | possible_keys      | key | key_len | ref   | rows | Extra            | 
+----+-------------+-------+------+-------------------------------------+-------+---------+-------------+-------+----------------------------------------------------+ 
| 1 | SIMPLE  | u  | ref | idx_1,idx_import,tbl_user_ibfk_2 | idx_1 | 8  | const,const | 55006 | Using index condition; Using where; Using filesort | 
+----+-------------+-------+------+-------------------------------------+-------+---------+-------------+-------+----------------------------------------------------+ 

В таблице содержится около 110000 записей.

Благодаря

UPDATE 1:

Ниже приведен список моих таблиц индексов:

Name    Fields      Type Method 
--------------------------------------------------------------- 
idx_1    site_id, role_id, email  Unique BTREE 
idx_import   site_id, external_id  Unique BTREE 
tbl_user_ibfk_2  role_id      Normal BTREE 
tbl_user_ibfk_3  country_id     Normal BTREE 
tbl_user_ibfk_4  preferred_country_id  Normal BTREE 
--------------------------------------------------------------- 
+1

Можете ли вы повторить те же результаты при перезагрузке (не только перезапуск службы) с запросами, выполненными в обратном порядке? – Uueerdo

+0

Вы прошли через это еще https://dev.mysql.com/doc/refman/5.1/en/index-hints.html - ваш ответ вполне может лежать в нем. –

+2

Первый запрос может записываться в кеш, второй может считываться из памяти, а не с диска, который быстрее. – baao

ответ

0

Вы не указали, которые MySQL вы используете. Значит ли это объяснить, это

До MySQL 5.1.17, USE INDEX, IGNORE INDEX и FORCE INDEX влияют только на какие индексы используются, когда MySQL решает, как найти строки в таблице и как обрабатывать соединения. Они не влияют на использование индекса при разрешении предложения ORDER BY или GROUP BY.

из https://dev.mysql.com/doc/refman/5.1/en/index-hints.html

+0

Я использую 5.6.25 –

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