作家
登录

MySQL:数据结构及算法原理

作者: 来源: 2017-05-11 13:40:27 阅读 我要评论

上文说过,红黑树等数据构造也可以用来实现索引,然则文件体系及数据库体系广泛采取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

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)