sql复合索引的探索
首先摆出道我在牛客里看到的题目
mysql数据库,game_order表表结构如下,下面哪些sql能使用到索引()?
-
select * from game_order where plat_game_id=5 and plat_id=134
-
select * from game_order where plat_id=134 and plat_game_id=5 and plat_order_id=’100’
-
select * from game_order where plat_order_id=’100’
-
select * from game_order where plat_game_id=5 and plat_order_id=’100’ and plat_id=134
-
select * from game_order where plat_game_id=5 and plat_order_id=’100’
正确答案:2345
这里就涉及到了复合索引的最左优先原则
最左优先就是说组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到。比如假设有一个3列索引(col1,col2,col3),那么MySQL只会会建立三个索引(col1),(col1,col2),(col1,col2,col3)。所以这道题目
根据最左匹配原则,where语句必须要有plat_order_id才能调用索引(如果没有plat_order_id字段那么一个索引也调用不到),如果同时出现plat_order_id与plat_game_id则会调用两者的组合索引,如果同时出现三者则调用三者的组合索引。
既然说到了索引,扩展一下回顾一下索引(单一,复合)的使用及注意事项
索引(Index)是帮助数据库高效获取数据的数据结构。索引是在基于数据库表创建的,它包含一个表中某些列的值以及记录对应的地址,并且把这些值存储在一个数据结构中,在进行数据库查询时使用索引,可以加速数据的查询。因为索引是有序排列的。最常见的就是使用哈希表、B+树作为索引。
单一索引和复合索引
单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上; 复合索引(组合索引)在多个列上建立索引; 复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引; 同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引;设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效;
关于复合索引的最左优先实现原理简单来说就是:
我们知道B+树是非常适合索引的结构,所以
一棵树
如果是单列,就按这列数据进行排序
如果是多列,就按多列数据排序,例如有(1,1) (2,2) (2,1) (1,2)
那在索引中的叶子节点的数据顺序就是(1,1)(1,2)(2,1)(2,2)
这也是为什么查询复合索引的前缀是可以用到索引的原因
如果还是不太明白现附上链接:
https://blog.csdn.net/weixin_30531261/article/details/79312676
扩展知识:https://blog.csdn.net/qq_37779709/article/details/80981292
最后放上一张经典的易记忆的图片