【问题标题】:mysql not using index on simple joinmysql在简单连接上不使用索引
【发布时间】:2013-06-28 00:04:33
【问题描述】:

我想知道为什么 mysql 在表 (visit_url) 的以下查询中没有使用索引:

> describe select sv.url from visit_url sv, result_query rq where rq.result_id = sv.result_id and rq.user_id = 'fred';
+----+-------------+-------+--------+---------------+---------+---------+------------------------+--------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                    | rows   | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+------------------------+--------+-------------+
|  1 | SIMPLE      | vu    | ALL    | result_id     | NULL    | NULL    | NULL                   | 506553 |             |
|  1 | SIMPLE      | rq    | eq_ref | PRIMARY       | PRIMARY | 32      |           vu.result_id |      1 | Using index |
+----+-------------+-------+--------+---------------+---------+---------+------------------------+--------+-------------+

我的索引是:

mysql> show index in visit_url;
+-----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| visit_url |          1 | result_id |            1 | result_id   | A         |      168851 |     NULL | NULL   |      | BTREE      |         |               |
| visit_url |          1 | url       |            1 | url         | A         |      253276 |     NULL | NULL   | YES  | BTREE      |         |               |
+-----------+------------+-----------+--------------+-------------+-----------+-------------+-------- --+--------+------+------------+---------+---------------+

mysql> show index in result_query;
+--------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table        | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| result_query |          0 | PRIMARY   |            1 | result_id   | A         |     2718272 |     NULL | NULL   |      | BTREE      |         |               |
| result_query |          1 | query_idx |            1 | query       | A         |      271827 |     NULL | NULL   |      | BTREE      |         |               |
+--------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

visit_url 有 506k 条目,result_query 有 2mil

非常感谢!

【问题讨论】:

  • 对不起,我的意思是 visit_url 有 506k 个条目

标签: mysql database indexing


【解决方案1】:

尝试使用与 where 子句分开的显式连接来编写查询,如下所示:

select sv.url from visit_url sv 
  join result_query rq on rq.result_id = sv.result_id
  where rq.user_id = 'fred';

【讨论】:

  • 我认为这不会有什么不同。甚至 mysql 也知道如何将旧式查询视为标准查询。
【解决方案2】:

result_query.user_id 未编入索引。因此,找到带有 user_id 的行需要对 200 万行进行全面扫描。相反,它会扫描 500k 行 visit_url,并使用主键与 result_query 连接。这样,它必须扫描最多 500k 行才能找到请求的user_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2012-04-26
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多