美文网首页
MySQL最左前缀原则

MySQL最左前缀原则

作者: 九点四十 | 来源:发表于2018-01-13 20:24 被阅读0次

    通过实例理解单列索引、多列索引以及最左前缀原则

    实例:现在我们想查出满足以下条件的用户id:

    mysql>SELECT `uid` FROM people WHERE lname`=’Liu’  AND `fname`=’Zhiqun’ AND `age`=26

    因为我们不想扫描整表,故考虑用索引。

    单列索引:

    ALTER TABLE people ADD INDEX lname (lname);

    将lname列建索引,这样就把范围限制在lname=’Liu’的结果集1上,之后扫描结果集1,产生满足fname=’Zhiqun’的结果集2,再扫描结果集2,找到 age=26的结果集3,即最终结果。

    由 于建立了lname列的索引,与执行表的完全扫描相比,效率提高了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除lname列上的索引,再创建fname或者age 列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。

    2.多列索引:

    ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);

    为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。

    注:在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。

    3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。

    注:在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

    拓展:在网上看到一个关于最左前缀原则提出这么一个例子。

    多列字段做索引,state/city/zipCode,想要索引生效的话,只能使用如下的组合

    state/city/zipCode

    state/city

    state

    其他方式(如city,city/zipCode),则索引不会生效

    这种现象是怎么导致的?和索引的存储方式有关吗?

    本人页参考了下其他网友的观点,个人认为,所谓最左前缀原则就是先要看第一列,在第一列满足的条件下再看左边第二列,以此类推。有位网友描述得很形象:

    你可以认为联合索引是闯关游戏的设计

    例如你这个联合索引是state/city/zipCode

    那么state就是第一关 city是第二关, zipCode就是第三关

    你必须匹配了第一关,才能匹配第二关,匹配了第一关和第二关,才能匹配第三关

    你不能直接到第二关的

    索引的格式就是第一层是state,第二层才是city

    索引是因为B+树结构  所以查找快  如果单看第三列  是非排序的。

    多列索引是先按照第一列进行排序,然后在第一列排好序的基础上再对第二列排序,如果没有第一列的话,直接访问第二列,那第二列肯定是无序的,直接访问后面的列就用不到索引了

    sql优化

    http://blog.csdn.net/zly9923218/article/details/51007554

    相关文章

      网友评论

          本文标题:MySQL最左前缀原则

          本文链接:https://www.haomeiwen.com/subject/dlhhoxtx.html