zoukankan      html  css  js  c++  java
  • 关于MySQL索引的最左前缀匹配原则原理说明说明

    假设有2个这样的SQL

    SELECT * FROM table WHERE a = 1 AND c = 3; // c不走索引

    SELECT * FROM table WHERE a = 1 AND b < 2 AND c = 3; // c不走索引

    假设数据 表T (a,b,c) rowid 为物理位置
    rowid a b c
    (1) 1 1 1
    (2) 2 1 13
    (3) 2 2 14
    (4) 1 3 3
    (5) 2 3 12
    (6) 1 2 5
    (7) 2 3 9
    (8) 1 2 2
    (9) 1 3 6
    (10) 2 2 11
    (11) 2 2 8
    (12) 1 1 7
    (13) 2 3 15
    (14) 1 1 4
    (15) 2 1 10

    当你创建一个索引 create index xxx on t(a,b), 则索引文件逻辑上等同于如下
    a b rowid
    1 1 1
    1 1 12
    1 1 14
    1 2 6
    1 2 8
    1 3 4
    1 3 9
    2 1 2
    2 1 15
    2 2 3
    2 2 10
    2 2 11
    2 3 5
    2 3 7
    2 3 13

    当select * from T where a=1 and b=3 的时候, 数据库系统可以直接从索引文件中直接二分法找到A=1的记录,然后再B=3的记录。
    但如果你 where b=3 则需要遍历这个索引表的全部!

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

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

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

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

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

    你不能直接到第二关的

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


    如果你单独为abc建立索引的话,(a,b,c)的意思就是先找a,然后在剩下的东西里面找b,然后在剩下的东西里面找c(当然你可以不这么实现但是他们是等价的)。这个时候b和c的索引起不到任何帮助。

    实战例子:
    https://www.cnblogs.com/developer_chan/p/9223671.html

  • 相关阅读:
    如何使用IntelliJ IDEA 14创建基于Maven3的Java Web Project
    一些python语法的合集
    thuwc2019滚粗记
    noip2018总结
    树链剖分
    NOIp2017游记(滚粗之旅)
    使用Redux管理你的React应用
    校招面试中积累的前端问题
    WebService 生成类的命令语句
    Request 请求页面的地址路径获取
  • 原文地址:https://www.cnblogs.com/chenhaoyu/p/8796430.html
Copyright © 2011-2022 走看看