一道笔试题,来源牛客

来源:互联网 发布:个人简介的app源码 编辑:程序博客网 时间:2024/05/17 04:53

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



A. select * from game_order where plat_game_id=5 and plat_id=134
B. select * from game_order where plat_id=134 and
   plat_game_id=5 and plat_order_id=’100’
C. select * from game_order where plat_order_id=’100’
D. select * from game_order where plat_game_id=5 and
   plat_order_id=’100’ and plat_id=134
E. select * from game_order where plat_game_id=5 and plat_order_id=’100’

刚看到此题一脸懵逼

后来仔细看了后面的unique key 部分,选的BD,理由是三个key都出现了

看了一些解释:

1.用到了btree树,为数据结构创建索引,然后定义为unique key唯一性约束,所以我觉得用到索引时三者都必须有,不然就不符合唯一性约束。不知道对不对,不对的话大家修改下

2.带头大哥不能死,中间兄弟不能断!

1的解释比较清楚,unique key由三个字段组成,缺一不可,索引使用的数据类型是btree,我的理解是三个字段绑定在一个leaf node,所以当查询条件为三个字段时,优先使用索引

2的解释比较好记,也很形象


如果理解的不对,还请指正


------2015-09-20 追加解析

  1. 这道题目想考察的知识点是MySQL组合索引(复合索引)的最左优先原则。最左优先就是说组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到。只要组合索引最左边第一个字段出现在Where中,那么不管后面的字段出现与否或者出现顺序如何,MySQL引擎都会自动调用索引来优化查询效率。
  2. 根据最左匹配原则可以知道B-Tree建立索引的过程,比如假设有一个3列索引(col1,col2,col3),那么MySQL只会会建立三个索引(col1),(col1,col2),(col1,col2,col3)。
  3. 所以题目会创建三个索引(plat_order_id)、(plat_order_id与plat_game_id的组合索引)、(plat_order_id、plat_game_id与plat_id的组合索引)。根据最左匹配原则,where语句必须要有plat_order_id才能调用索引(如果没有plat_order_id字段那么一个索引也调用不到),如果同时出现plat_order_id与plat_game_id则会调用两者的组合索引,如果同时出现三者则调用三者的组合索引。
  4. 题目问有哪些sql能使用到索引,个人认为只要Where后出现了plat_order_id字段的SQL语句都会调用到索引,只不过是所调用的索引不同而已,所以选BCDE。如果题目说清楚是调用到三个字段的复合索引,那答案才是BD。

原创粉丝点击