为什么没有索引这个MySQL查询更快?

时间:2015-10-07 00:05:48

标签: php mysql

当我将其更改为不使用索引时,我无法理解为什么我的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
---------------------------------------------------------------

1 个答案:

答案 0 :(得分:0)

您尚未指定使用的是哪个mysql。这解释了吗

  

在MySQL 5.1.17之前,当MySQL决定如何在表中查找行以及如何处理联接时,USE INDEX,IGNORE INDEX和FORCE INDEX仅影响使用哪些索引。它们不影响在解析ORDER BY或GROUP BY子句时是否使用索引。

来自https://dev.mysql.com/doc/refman/5.1/en/index-hints.html