sql复合索引的探索

首先摆出道我在牛客里看到的题目

mysql数据库,game_order表表结构如下,下面哪些sql能使用到索引()?

 

  1. select * from game_order where plat_game_id=5 and plat_id=134
  2. select * from game_order where plat_id=134 and
    plat_game_id=5 and plat_order_id=’100’
  3. select * from game_order where plat_order_id=’100’
  4. select * from game_order where plat_game_id=5 and
    plat_order_id=’100’ and plat_id=134
  5. 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

最后放上一张经典的易记忆的图片

posted on 2019-02-26 21:45  牧羊人李七夜  阅读(1249)  评论(0编辑  收藏  举报

导航