mysql表结构
这让我感到困惑,如果查询范围影响使用 mysql 中的索引 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!
mysql表结构
这让我感到困惑,如果查询范围影响使用 mysql 中的索引 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!
这就是发生的事情。它实际上是一种优化。
使用辅助键(如INDEX(teacher_id)
)时,处理过程如下:
1
)然后向前扫描(直到5000
或10000
)是非常有效的。SELECT *
)。这使用PRIMARY KEY
,其副本位于辅助键中。PK和数据聚集在一起;通过一个 PK 值进行的每次查找都是有效的(同样是 BTree),但您需要执行 5000 或 10000 个。所以成本(花费的时间)加起来。“表扫描”(即不使用 any INDEX
)如下所示:
WHERE
子句(范围 on teacher_id
)。如果需要查看超过 20% 的表,则表扫描实际上比在二级索引和数据之间来回弹跳要快。
因此,“大”大约是 20%。实际值取决于表统计信息等。
底线:让优化器做它的事;大多数时候它最清楚。
简而言之,我使用 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配置都可能扫描行数判断是否使用索引。!!!!!!