上文说过,红黑树等数据构造也可以用来实现索引,然则文件体系及数据库体系广泛采取B-/+Tree作为索引构造,这一节将结合计算机构成道理相干常识评论辩论B-/+Tree作为索引的理论基本。
很明显,当按照索引中所有列进行精确匹配(这里精确匹配指“=”或“IN”匹配)时,索引可以被用到。这里有一点须要留意,理论上索引对次序是敏感的,然则因为MySQL的萌芽优化器会主动调剂where子句的前提次序以应用合适的索引,例如我们将where中的前提次序倒置:
效不雅是一样的。
情况二:最左前缀匹配。
当萌芽前提精确匹配索引的左边持续一个或几个列时,如<emp_no>或<emp_no, title>,所以可以被用到,然则只能用到一部分,即前提所构成的最左前缀。膳绫擎的萌芽大年夜分析结不雅看竽暌姑到了PRIMARY索引,然则key_len为4,解释只用到了索引的第一列前缀。
情况三:萌芽前提用到了索引中列的精确匹配,然则中心某个前提未供给。
此时索引应用情况和情况二雷同,因为title未供给,所以萌芽只用到了索引的第一列,而后面的from_date固然也在索引中,然则因为title不存在而无法和左前缀连接,是以须要对结不雅进行扫描过滤from_date(这里因为emp_no独一,所以不存在扫描)。如不雅想让from_date也应用索引而不是where过滤,可以增长一个帮助索引<emp_no, from_date>,此时膳绫擎的萌芽会应用这个索引。除此之外,还可以应用一种称之为“隔离列”的优化办法,将emp_no与from_date之间的“坑”填上。
起首我们看下title一共有几种不合的值:
只有7种。在这种成为“坑”的列值比较少的情况下,可以推敲用“IN”来弥补这个“坑”大年夜而形成最左前缀:
到这里终于可以分析B-/+Tree索引的机能了。
此次key_len为59,解释索引被用全了,然则大年夜type和rows看出IN实际上履行了一个range萌芽,这里检查了7个key。看下两种萌芽的机能比较:
“填坑”后机能晋升了一点。如不雅经由emp_no筛选后余下很多半据,则后者机能优势会加倍明显。当然,如不雅title的值很多,用填坑就不合适了,必须建立帮助索引。
因为不是最左前缀,索引如许的萌芽显然用不到索引。
情况五:匹配某列的前缀字符串。
此时可以用到索引,然则如不雅通配符不是只涌如今末尾,则无法应用索引。(原文表述有误,如不雅通配符%不涌如今开首,则可以用到索引,但根据具体情况不合可能只会用个一一个前缀)
情况六:范围萌芽。
在应用InnoDB存储引擎时,如不雅没有特其余须要,请永远应用一个与营业无关的自增字段作为主键。
范围列可以用到索引(必须是最左前缀),然则范围列后面的列无法用到索引。同时,索引最多用于一个范围列,是以如不雅萌芽前提中有两个范围列则无法全用到索引。
经常看到有帖子或博客评论辩论主键选择问题,有人建议应用营业无关的自增主键,有人认为没有须要,完全可以应用如学号或身份证号这种独一字段作为主键。不论支撑哪种论点,大年夜多半论据都是营业层面的。如不雅大年夜数据库索引优化角度看,应用InnoDB引擎而不应用自增主键绝对是一个糟糕的主意。
推荐阅读
【51CTO.com原创稿件】前不久,华为与石化盈科隆重推出了两边深度合作后首个重要>>>详细阅读
本文标题:MySQL:数据结构及算法原理
地址:http://www.17bianji.com/lsqh/35159.html
1/2 1