一 .列的离散性count(distinct col):count(col)
列的离散性(可以理解为差异性)=count(distinct col ) / count(col)
count(distinct col ) / count(col)比例越大,离散性越好
如图,name的离散性最高,sex最小
1.1离散型干啥的,有什么好处?
离散型越高,选择性越好,离散型越低,选择性越差
如下图,假如我们以sex做索引,0代表男,1代表女,建立索引,当我们建立好了,会发现,有好多路都一样,根本不知道去哪.....还不如直接全表顺序扫描哈哈哈
二 .最左匹配原则
对索引中关键字进行计算并排序(对比),一定是从左往右依次进行,且不可跳过.而且如果索引是字符串会一个字符一个字符的比对,如果是数字会直接比大小.如果是联合索引其实整体上类似于String的局部比较
啥意思呢?比如说我们按照name建立索引
现在有两个name 一个是abc 一个是 a c b 一个是abg 一个是kut 一个是oop
那么一定先按一个字母一个字母位置的排,每次以前一个为基准继续排
2.1什么是联合索引?
- 单列索引 节点中关键字[name]
- 联合索引 联合索引不是好几个索引,他还是一个索引 节点中关键字[name,phoneNum]
- 单列索引是特殊的联合索引
2.2联合索引的理解
其实联合索引页就是一个组合索引而已 像[name,phoneNum] 索引结构也就是[abc,13333355533],只不过我们在按name排序后,我们才会按照phoneNum排序
2.3联合索引建立时候,列的选择原则
下面所谓的优先就是放最左边
- 1,经常用的列优先【最左匹配原则】
- 2,选择性(离散度)高的列优先【离散度高原则】
- 3,宽度小的列优先【最少空间原则】
2.4 建立联合索引的一些笨蛋问题(挖坑操作)
经排查发现最常用的sql语句:
代码语言:javascript复制Select*from users where name =?;
Select*from users where name=?and phoneNum=?;
"机灵"的李二狗的解决方案:
代码语言:javascript复制create index idx_name_phoneNum on users(name,phoneNum);
create index idx_name on users(name);
然而...你联合索引把name放第一位了,还另外建什么name索引啊
三 覆盖索引
如果查询列(select后跟的字段)可通过索引节点中的关键字直接返回,则该索引称之为覆盖索引。
覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能注意:
由于其是通过关键字返回的值,所以其关键字结点上必然保存了数据,故覆盖索引需要是和结点存放数据的Innodb连用,而MyaIsam用不到覆盖索引.