索引离散性 && 最左匹配原则

2021-12-22 15:25:41 浏览数 (2)

一 .列的离散性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用不到覆盖索引.

0 人点赞