当我将其更改为不使用索引时,我无法理解为什么我的MySQL查询运行得更快。
我的第一个查询需要0.236秒才能运行:
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.147秒才能运行:
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
我在列site_id,role_id和email上有一个名为idx_1的唯一索引。
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条记录。
由于
更新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
---------------------------------------------------------------
答案 0 :(得分:0)
您尚未指定使用的是哪个mysql。这解释了吗
在MySQL 5.1.17之前,当MySQL决定如何在表中查找行以及如何处理联接时,USE INDEX,IGNORE INDEX和FORCE INDEX仅影响使用哪些索引。它们不影响在解析ORDER BY或GROUP BY子句时是否使用索引。