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