加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Java高级编程——MySQL索引实现及优化原理解析

发布时间:2018-08-30 18:10:53 所属栏目:编程 来源:Java高并发框架
导读:技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战 在MySQL中,索引属于存储引擎级此外面念,差异存储引擎对索引的实现方法是差异的,本文首要接头MyISAM和InnoDB两个存储引擎的索引实现方法。 MyISAM索引实现MyISAM引擎行使B+Tree作

这样就可以用心说明索引PRIMARY的举动了。环境一:全列匹配

Java高级编程——MySQL索引实现及优化道理理会

很明明,当凭证索引中全部罗列办准确匹配(这里准确匹配指“=”或“IN”匹配)时,索引可以被用到。这里有一点必要留意,理论上索引对次序是敏感的,可是因为MySQL的查询优化器会自动调解where子句的前提次序以行使得当的索引,譬喻我们将where中的前提次序颠倒:

Java高级编程——MySQL索引实现及优化道理理会

结果是一样的。环境二:最左前缀匹配

Java高级编程——MySQL索引实现及优化道理理会

当查询前提准确匹配索引的左边持续一个或几个列时,如<emp_no>或<emp_no, title>,以是可以被用到,可是只能用到一部门,即前提所构成的最左前缀。上面的查询从说明功效看用到了PRIMARY索引,可是key_len为4,声名只用到了索引的第一列前缀。环境三:查询前提用到了索引中列的准确匹配,可是中间某个前提未提供

Java高级编程——MySQL索引实现及优化道理理会

此时索引行使环境和环境二沟通,由于title未提供,以是查询只用到了索引的第一列,尔后头的from_date固然也在索引中,可是因为title不存在而无法和左前缀毗连,因此必要对功效举办扫描过滤from_date(这里因为emp_no独一,以是不存在扫描)。假如想让from_date也行使索引而不是where过滤,可以增进一个帮助索引<emp_no, from_date>,此时上面的查询会行使这个索引。除此之外,还可以行使一种称之为“断绝列”的优化要领,将emp_no与from_date之间的“坑”填上。起首我们看下title一共有几种差异的值:

Java高级编程——MySQL索引实现及优化道理理会

只有7种。在这种成为“坑”的列值较量少的环境下,可以思量用“IN”来弥补这个“坑”从而形成最左前缀:

Java高级编程——MySQL索引实现及优化道理理会

这次key_len为59,声名索引被用全了,可是从type和rows看出IN现实上执行了一个range查询,这里搜查了7个key。看下两种查询的机能较量:

Java高级编程——MySQL索引实现及优化道理理会

“填坑”后机能晋升了一点。假如颠末emp_no筛选后余下很大都据,则后者机能上风会越发明明。虽然,假如title的值许多,用填坑就不吻合了,必需成立帮助索引。环境四:查询前提没有指定索引第一列

Java高级编程——MySQL索引实现及优化道理理会

因为不是最左前缀,索引这样的查询显然用不到索引。环境五:匹配某列的前缀字符串

Java高级编程——MySQL索引实现及优化道理理会

此时可以用到索引,可是假如通配符不是只呈此刻末端,则无法行使索引。(原文表述有误,假如通配符%不呈此刻开头,则可以用到索引,但按照详细环境差异也许只会用个中一个前缀)环境六:范畴查询

Java高级编程——MySQL索引实现及优化道理理会

范畴列可以用到索引(必需是最左前缀),可是范畴列后头的列无法用到索引。同时,索引最多用于一个范畴列,因此假如查询前提中有两个范畴列则无法全用到索引。

Java高级编程——MySQL索引实现及优化道理理会

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读