Java高级编程——MySQL索引实现及优化道理理会
这样就可以用心说明索引PRIMARY的举动了。环境一:全列匹配 很明明,当凭证索引中全部罗列办准确匹配(这里准确匹配指“=”或“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”来弥补这个“坑”从而形成最左前缀: 这次key_len为59,声名索引被用全了,可是从type和rows看出IN现实上执行了一个range查询,这里搜查了7个key。看下两种查询的机能较量: “填坑”后机能晋升了一点。假如颠末emp_no筛选后余下很大都据,则后者机能上风会越发明明。虽然,假如title的值许多,用填坑就不吻合了,必需成立帮助索引。环境四:查询前提没有指定索引第一列 因为不是最左前缀,索引这样的查询显然用不到索引。环境五:匹配某列的前缀字符串 此时可以用到索引,可是假如通配符不是只呈此刻末端,则无法行使索引。(原文表述有误,假如通配符%不呈此刻开头,则可以用到索引,但按照详细环境差异也许只会用个中一个前缀)环境六:范畴查询 范畴列可以用到索引(必需是最左前缀),可是范畴列后头的列无法用到索引。同时,索引最多用于一个范畴列,因此假如查询前提中有两个范畴列则无法全用到索引。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |