【发布时间】:2020-08-23 12:29:23
【问题描述】:
我有一张表:student_homework,它的复合索引之一是uk_sid_lsnid_version(student_id, lesson_id, curriculum_version, type):
student_homework 0 uk_sid_lsnid_version 1 student_id A 100 BTREE
student_homework 0 uk_sid_lsnid_version 2 lesson_id A 100 BTREE
student_homework 0 uk_sid_lsnid_version 3 curriculum_version A 100 BTREE
student_homework 0 uk_sid_lsnid_version 4 type A 100 BTREE
现在我有一个 Sql:
select * from student_homework where student_id=100 and type=1 和 explain 结果是这样的:
1 SIMPLE student_homework ref uk_sid_lsnid_version,idx_student_id_update_time uk_sid_lsnid_version 4 const 20 10.0 Using index condition
执行计划是uk_sid_lsnid_version。
我的问题是查询条件type 在这里如何工作?数据库引擎是否扫描所有(缩小的)记录?在我的理解中,树的层次结构是:
student_id
/ \
lesson_id lesson_id
/ \
curriculum_version curriculum_version
/ \
type type
对于查询条件(student_id, type),student_id匹配树索引的根。然而,type 与索引 lesson_id 不匹配,数据库引擎将在 所有记录 上应用 type,这些记录已被 student_id 过滤。
- 我的理解正确吗?如果带有
student_id的子集记录很大,则查询成本仍然很高。 - 查询条件student_id = 100 and type =0和type=0 and student_id = 100没有区别
- 为了充分利用复合索引,如果我添加一个新的复合索引会更好(student_id, type)?
【问题讨论】:
-
是的,做一个复合索引,但仍然用不同的索引测试查询,看看eh性能是否变得更好
-
请提供
SHOW CREATE TABLE;我们需要比你提供的更多的细节。 -
只能使用
INDEX的最左边列;没有跳过列。WHERE的顺序无关紧要。更多:mysql.rjweb.org/doc.php/index_cookbook_mysql
标签: mysql query-performance composite-key