【问题标题】:mysql range query , use index judge range largemysql范围查询,使用索引判断范围大
【发布时间】:2018-05-24 16:39:43
【问题描述】:

mysql 表结构

如果查询范围影响mysql中的使用索引,这让我很困惑 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

【问题讨论】:

  • 请将您的 SQL 添加到问题中,而不是使用屏幕截图。另外,请附上一个简洁的问题,说明您需要什么帮助,以及显示问题的简化版本的代码。

标签: mysql indexing range range-query


【解决方案1】:

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

当使用辅助键(如INDEX(teacher_id))时,处理过程如下:

  1. 进入索引,这是一个 B+树。在这样的结构中,找到一个特定的值(例如1)然后向前扫描(直到500010000)是非常有效的。
  2. 对于每个条目,进入数据以获取行 (SELECT *)。这使用了PRIMARY KEY,它的副本在辅助键中。 PK和数据聚集在一起;通过一个 PK 值进行的每次查找都是有效的(同样是 BTree),但您需要执行 5000 或 10000 个。因此,成本(花费的时间)加起来。

“表扫描”(即不使用任何INDEX)如下所示:

  1. 从表格的开头开始,遍历表格的 B+Tree(按 PK 顺序)直到结束。
  2. 对于每一行,检查WHERE 子句(teacher_id 上的范围)。

如果需要查看超过 20% 的表,则表扫描实际上比在二级索引和数据之间来回弹跳要快。

所以,“大”大约是 20%。实际值取决于表统计等。

底线:让优化器做它的事; 大部分时间它最了解。

【讨论】:

    【解决方案2】:

    简而言之,我使用 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 table type possible_keys key key_len ref rows Extra

    1 1 SIMPLE t_teacher_course_info ALL idx_teacher_update_time 671082 在哪里使用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2020-05-19
      • 2014-02-13
      • 2022-12-12
      相关资源
      最近更新 更多