-3

mysql表结构 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

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

4

2 回答 2

1

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

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

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

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

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

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

因此,“大”大约是 20%。实际值取决于表统计信息等。

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

于 2017-12-11T19:49:04.900 回答
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 table type possible_keys key key_len ref rows Extra

1 1 简单 t_teacher_course_info ALL idx_teacher_update_time 671082 使用 where

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

于 2017-12-11T07:35:06.907 回答