У меня возникли проблемы с пониманием того, почему мой запрос 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
---------------------------------------------------------------
Можете ли вы повторить те же результаты при перезагрузке (не только перезапуск службы) с запросами, выполненными в обратном порядке? – Uueerdo
Вы прошли через это еще https://dev.mysql.com/doc/refman/5.1/en/index-hints.html - ваш ответ вполне может лежать в нем. –
Первый запрос может записываться в кеш, второй может считываться из памяти, а не с диска, который быстрее. – baao