mysql范围查询,使用索引判断范围大

时间:2017-12-11 07:24:48

标签: mysql indexing range range-query

mysql表结构 enter image description here enter image description here enter image description here enter image description here

如果查询范围影响使用mysql中的索引,那会让我感到困惑 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2 个答案:

答案 0 :(得分:0)

简而言之,我使用的是mysql数据库 执行 EXPLAIN SELECT * FROM t_teacher_course_info WHERE teacher_id >1 and teacher_id < 5000 将使用索引INDEX `idx_teacher_id_last_update_time` (`teacher_id`, `last_update_time`)

但是如果改变范围 EXPLAIN SELECT * FROM t_teacher_course_info WHERE teacher_id >1 and teacher_id < 10000 id select_type表类型possible_keys键key_len ref rows Extra

1 1 SIMPLE t_teacher_course_info ALL idx_teacher_update_time 671082使用位置

扫描所有表,不使用索引,任何mysql配置 也许扫描行数判断是否使用索引。 !!!!!!!

答案 1 :(得分:0)

这就是发生的事情。它实际上是一种优化。

使用辅助密钥(例如INDEX(teacher_id))时,处理如下:

  1. 到达索引,这是一个B +树。在这样的结构中,找到特定值(例如1)然后向前扫描(直到500010000)非常有效。
  2. 对于每个条目,覆盖数据以获取行(SELECT *)。这使用PRIMARY KEY,其副本位于辅助密钥中。 PK和数据聚集在一起;每个查找一个PK值是有效的(再次,BTree),但你需要做5000或10000。因此,成本(所花费的时间)加起来。
  3. A&#34;表扫描&#34; (即,不使用任何INDEX)如下所示:

    1. 从表格的开头开始,遍历表格的B +树(按PK顺序)直到结束。
    2. 对于每一行,请检查WHERE子句(teacher_id上的范围)。
    3. 如果需要查看超过20%表的内容,表扫描实际上比在二级索引和数据之间来回弹跳更快。

      所以,&#34;大&#34;大概在20%左右。实际值取决于表统计等。

      底线:让优化器做它的事情; 大多数它最清楚的时间。