本文主要介绍Mysql联邦索引的最左匹配原理,使用联邦索引有很多好处。请跟随我们的边肖了解详情。
前言
之前在网上看过很多关于mysql联合索引最左前缀匹配的文章,我想我知道它的原理。最近面试的时候和面试官交流,发现少了点什么。在这里,我自己来梳理一下这方面。
最左前缀匹配原则
Mysql在建立联邦索引时会遵循最左侧前缀匹配的原则,即先从最左侧开始,检索数据时从联邦索引的最左侧开始匹配。例如:
为列col1、列col2和列col3建立联合索引。
关键test_col1_col2_col3 on test(col1,col2,col 3);
联合索引test_col1_col2_col3实际上建立了三个索引(col1)、(col1,col2)和(col2,col3)。
SELECT * FROM test WHERE col 1=" 1 " AND clo 2=" 2 " AND clo 4=" 4 "
上面的查询语句将按照最左前缀匹配原则执行,检索时将使用索引(col1,col2)进行数据匹配。
注意
索引的字段可以按任何顺序排列,例如:
SELECT * FROM test WHERE col 1=" 1 " AND clo 2=" 2 "
SELECT * FROM test WHERE col 2=" 2 " AND clo 1=" 1 "
两个查询语句都将使用索引(col1,col2)。mysql创建联合索引的规则是先对最左边联合索引的数据即第一个字段col1进行排序,然后在第一个字段的基础上对第二个字段col2进行排序。实际上,它相当于实现了一个类似order by col1 col2的排序规则。
有人奇怪第二条查询语句和最左边的前缀不匹配:首先,可以肯定的是两条查询语句都保证了保证索引(col1,col2)中的col1和col2字段,只是顺序不同,查询条件相同,最终的查询结果肯定是一样的。既然结果相同,那么按什么顺序查询才是最好的查询方式呢?此时,我们可以使用mysql查询优化器explain,它会以最高的效率修正sql语句应该执行的顺序,最终生成真正的执行计划。
为什么要使用联合索引
减少开销。构建一个联合索引(col1,col2,col3),实际上相当于构建三个索引(Col1),(Col1,Col2)和(Col1,Col2,Col3)。每个额外的索引都会增加写入和磁盘空间的开销。对于有大量数据的表,使用联邦索引会大大减少开销!
覆盖索引。对联合索引(col1,col2,col3),如果有以下SQL: select col1,col2,col3 from test where col1=1,col2=2。那么MySQL就可以通过遍历索引直接获取数据,而不需要返回表,减少了大量的随机io操作。减少io操作,尤其是随机io,其实是dba的主要优化策略。因此,在实际应用中,覆盖指数是提高性能的主要优化方法之一。
效率高。索引中的列越多,通过索引过滤的数据就越少。一个有1000W数据的表有以下SQL: select from table其中col1=1,col2=2,col3=3,假设每个条件可以筛选出10%的数据。如果只有一个单值指标,那么可以通过这个指标筛选出1000W10%=100w的数据,然后从100w的数据中找到符合col2=2和col3=3的数据。如果是联合索引,通过索引筛选出1000w10% 10% *10%=1w,效率提升可想而知!
引申
对于联合索引(col1,col2,col3),查询语句SELECT * FROM test,其中col2=2指数可以触发吗?
大多数人会说不是,其实是是的。
原因:
解释SELECT * FROM test,其中col2=2
解释SELECT * FROM test,其中col1=1
观察上面两个解释结果中的类型字段。这些查询是:
类型:索引
类型:参考
Index:这种类型表示mysql将扫描整个索引。如果要使用这种类型的索引,对这种索引没有特殊要求。只要是索引或者是联合索引的一部分,mysql都可能按索引类型扫描。但是缺点是效率不高。mysql会从索引中的第一个数据开始逐个查找最后一个数据,直到找到满足判断条件的索引。因此,上述语句将触发索引。
Ref:这种类型表示mysql会根据特定的算法快速找到某个符合条件的索引,而不是对索引中的每一个数据逐一扫描判断。也就是说,您通常理解使用索引查询将更快地获取数据。但是,为了实现这种搜索,需要索引。为了实现这种快速搜索算法,索引必须满足特定的数据结构。简单地说,索引字段中的数据必须是为了实现这种类型的搜索和利用索引。
总结
以上是边肖介绍的Mysql联合索引最左匹配原则。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。