前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >索引离散性 && 最左匹配原则

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

作者头像
名字是乱打的
发布2021-12-22 15:25:41
8310
发布2021-12-22 15:25:41
举报
文章被收录于专栏:软件工程软件工程
一 .列的离散性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用不到覆盖索引.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 .列的离散性count(distinct col):count(col)
  • 1.1离散型干啥的,有什么好处?
  • 二 .最左匹配原则
    • 2.1什么是联合索引?
      • 2.2联合索引的理解
        • 2.3联合索引建立时候,列的选择原则
          • 2.4 建立联合索引的一些笨蛋问题(挖坑操作)
            • 三 覆盖索引
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档