用简单例子带你了解联合索引查询原理及生效规则

为了优化数据库性能并减少磁盘使用,通常会设计连接索引并避免使用单字段索引。
本文以学生成绩册为例,讲解连接索引查询的原理和有效规则。
如果要查询特定班级、姓名、学科的学生成绩,可以创建包含[学生班级、学生姓名、学科名称]的联接索引。
索引页存储最小值,数据页形成有序链表,搜索过程遵循等值匹配规则。
如果SQL查询的where条件与索引字段完全匹配并且使用相同顺序的等号,则直接使用连接索引进行高效搜索。
使用连接索引的关键是相等匹配和最左列匹配原则。
只要查询最左边的索引字段(比如类),MySQL就会自动优化它们,即使它们是乱序的。
范围搜索仅限于连接索引的最左列,例如“class_name>'Class1'”或“class_name'Class5'”。
您可以使用索引来搜索某个范围内的数据。
如果范围查询与其他字段(例如`student_name>''`)组合查询,则无法使用索引。
实际使用时,编写类似`SELECT*FROMstudent_scoreWHEREclass_name='1Class'ANDsubject_name<'Math'`这样的SQL语句,让范围查询只针对连接索引最左边的列,以最大化索引。
提高查询效率。

范围查询优化:索引跳跃扫描

在优化数据库查询时,范围查询是一个常见的需求。
通常,联邦索引的构建遵循最左前缀匹配的原则,即要求查询语句的where子句中包含最左索引的值。
然而,随着MySQL8.0的出现,索引跳过扫描(IndexSkipScan)引入了新的查询优化技术。

40查询将导致全表扫描。
范围扫描虽然比全索引扫描更有效,但在这种情况下不能使用。
MySQL8.0.13及更高版本通过索引跳跃扫描优化了这个问题。
优化器可以对f1的每个值执行f2的范围扫描,从而有效减少可用行数。

索引跳过扫描适用于以下情况:如果EXPLAIN输出中出现“Usingindexforskipscan”,则表示查询可以使用此策略。
MySQL是否启用索引跳过扫描由Optimer_switch系统变量控制,其默认状态是启用的。
要禁用它,请将Skip_scan设置为Off。

具体操作可以参考如下语句查询Skip_scan值,获取更详细的信息。
阅读其他文档和博客文章以更深入地理解和应用示例。

dev.mysql.com/doc/refman/8.0/en/system-variables.html#sysvar_optimizer_switch

blog.csdn.net/yy139926/article/details/101665530

mysql覆盖索引和联合索引的区别

共享索引和封闭索引有一个很大的区别:在封闭索引中,可以通过索引直接提取查询的列,例如只查询主键列!或者从左边开始查询所有索引列或多列(注意顺序)!共享索引不一定从索引中获取所有数据,这取决于您要查询的列。
例如,select*fromwhere××××××方法不能是结束索引。
因此,如果你查询的列可以使用共享索引,并且你查询的列可以通过共享索引获取到,比如你只查询共享索引所在的列或者从向左,这相当于覆盖索引。
通常,为了使查询能够使用封闭索引,需要将多列待查询的数据设置为共享索引。