MySQL原理(四)索引(3)索引失效与索引区分度

一、索引失效:

首先未使用索引列作为查询条件索引是肯定会生效的,还有其他的情况,索引列做为了查询条件也失效了:

 ALTER TABLE staffs ADD INDEX idx_staffs_nameAgePos(NAME, age, pos);

1、select 语句、order by语句:和索引无关;

2、where语句索引失效:

(1)组合索引失效:如果索引了多列,要遵守最左前缀法则,Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但必须包含最左侧的一个。例如索引是index (a,b,c),可以支持a | a,b| a,b,c |a,c这几种组合进行查找,但不支持 b|b,c|c进行查找 。如

注:

组合索引最好全值匹配(查询条件的顺序和索引的顺序一致,这种方式最好,能够充分发挥索引的作用,当然使用and连接的查询提交也可以不与索引的顺序一致,mysql会自动优化,如index(a,b,c),where a= and b= and c= 与where b= and c= and a=,...效果是一样的 

(2)列类型是字符串,查询条件未加引号;

(3)使用like时通配符在前会导致索引失效,通配符在后面时效率不受影响,所以一般使用右模糊:

(4)查询条件中使用or会使索引失效,要想是索引生效,需要将or中的每个列都加上索引;

(5)对索引列进行计算、函数、(自动or手动)类型转换会导致索引失效,如where substr(a, 1, 3) = ‘hhh’、where a = a+1、DATE_FORMAT函数等;

注意:索引失效指的是where条件不当引起的失效,如这里计算放在select后面是不会引起索引失效的。

(6)mysql 在使用不等于(!= )的时候无法使用索引,会导致全表扫描;

(7)使用in查询,当in()括号里面只有一个时,索引有效;否则无效。如表zt_test现有数据和索引如下:

 现在查询:

当in的条件多于1个时,

小结:假设index(a,b,c):

sql有没有用到索引,有的话用到了哪些
where c=1 and b=1 and a='aaa'  用到了a,b,c
where a = 'aaa'  and c=1 用到了a,没有用到c
where a like '%aaa%' and b=1 and c=1  没有用到
where a like 'aaa%' and b=1 and c=1 用到
where a ='aaa' and b like '1%' and c=1用到了a和b, c在模糊查询的通配符之后,断了
where a = 111 and b =1 and c=1 没有用到
where a = 'aaa' or b =1 or c=1   没有用到
where a!='aaa' and b =1 and c=1 没有用到
where (a+'aa')!='aaa'  没有用到
ORDER BY a  没有用到
GROUP  BY a 用到

二、索引长度与索引区分度

在SQL执行计划中,key_len 表示索引长度,经常用于判断复合索引是否被完全使用。

注:在utf8编码方式下,一个字符占3个字节;utf8mb4一个字符占4个字节;gbk中一个字符占2个字节;latin中一个字符占1个字节。索引长度可以指定,不指定的情况下会按照规则使用默认的长度。

1、默认索引长度定义:

在没有指定索引长度的情况下,如果索引字段不为空且长度不可变,索引长度等于该字段的长度;可以为null,mysql会用1个字节标识;长度可变,MySQL会使用2个字节标识。以utf8编码为例

(1)如果索引字段不为空且长度不可变,索引长度等于该字段的长度;

CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` char(20) NOT NULL,PRIMARY KEY (`id`),KEY `index_name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

随便插入几条数据:

    

 索引查询: key_len = 60,索引段name的长度是20个字符,key_len = 20*3 = 60。

   

(2)如果索引字段不为空,长度可变:改成varchar:

   

查询:key_len = 20*3 +2= 62

(3)如果索引字段可以为空,长度不可变:

    

  查询:key_len = 20*3 +1= 61

  

(4)以此类推,字段既可以为空长度也可变,索引长度+2+1:

   

查询:

  

(5)复合索引:索引列长度之和

CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`address` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),KEY `index_name_address` (`name`,`address`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

   

 key_len长度为63,说明只用到了复合索引的前半部分;

 key_len长度为126,说明该SQL查询语句用了整个复合索引。

 综上,key_len 表示索引长度,经常用于判断复合索引是否被完全使用。

2、指定索引长度:
CREATE INDEX index_name ON table_name column_name(length);

 如对于表

 设置索引长度:

ALTER TABLE test ADD INDEX index_name_address (`name`(10),`address`(10));

 

 key_len = 10*3+2+1+10*3+2+1=66。

3、索引区分度:

区分度百分比 = select count(distinct left(索引字段,索引长度))/count(1) from table。区分度越高,查询越快,如主键索引,主键是唯一的,主键索引的区分度就是1。区分度低的索引原则上已失去意义,没有明显的查询效率,而且添加了索引每次查询会先走索引树,再回表查询,增加了额外的io消耗,就不如直接查询原表来的效率高

4、总结:

索引长度和区分度是相互矛盾的,索引长度太短,那么区分度就很低,把索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点。

举个例子:(张,张三,张三哥),如果索引长度取1的话,那么每一行的索引都是 张 这个字,完全没有区分度,无法排序,结果这样三行完全是随机排的,因为索引都一样;如果长度取2,那么排序的时候至少前两个是排对了的,如果取3,区分度达到100%,排序完全正确;但是并不是索引越长越好,比如 (张,李,王) 和 (张三啦啦啦,张三呵呵呵,张三呼呼呼);前者在内存中排序占得空间少,排序也快,后者明显更慢更占内存,在大数据应用中这一点点影响都是很大的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/444244.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快捷查看电脑配置

目录 1.左下角搜索输入cmd打开控制台,输入命令**systeminfo**然后回车2.左下角搜索系统信息然后点开 👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见…

pnpm : 无法加载文件 D:\tool\nvm\nvm\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

你们好,我是金金金。 场景 新创建的项目,在vscode编辑器终端输入 pnpm i,显示报错如上 解决 在终端输入get-ExecutionPolicy(查看执行策略/权限) 输出Restricted(受限的) 终端再次输入Set-ExecutionPolicy -Scope CurrentUser命令给用户赋予…

神经网络的一些常规概念

epoch:是指所有样本数据在神经网络训练一次(单次epoch(全部训练样本/batchsize)/iteration1)或者(1个epochiteration数 batchsize数) batch-size:顾名思义就是批次大小,也就是一次训练选取的样…

贪吃蛇/链表实现(C/C++)

本篇使用C语言实现贪吃蛇小游戏,我们将其分为了三个大部分,第一个部分游戏开始GameStart,游戏运行GameRun,以及游戏结束GameRun。对于整体游戏主要思想是基于链表实现,但若仅仅只有C语言的知识还不够,我们还…

数据结构_单链表题-2.1

一. 反转单链表 将一个单链表反过来。 个人思路(一团浆糊大错特错) 反转嘛,变最后为起点,依次反转过来就行了。 1)找到最后三个链表结点,分别保存下来,以最后一个为首地址。 2)最…

【51单片机系列】应用设计——8路抢答器的设计

51单片机应用——8路抢答器设计 文章设计文件及代码:资源链接。 文章目录 要求:设计思路软件设计仿真结果 要求: (1) 按下”开始“按键后才开始抢答,且抢答允许指示灯亮; (2&…

Orion-14B-Chat-RAG本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

人麻了,刚面试入职就遇到MySQL亿级大表调优...

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

全新AI智能助手

在这个信息爆炸的时代,每个人都在寻找能够提升效率、激发创造力的工具。MidTool正是这样一款工具,它不仅能够帮助用户节省宝贵的时间,还能够激活用户的潜能,为创造力充电。MidTool的多功能性和高效率使其成为市场上最具吸引力的智…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏6(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言生命 食物 水简单绘制UI玩家状态脚本生命值控制饱食度控制水分控制 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中…

我的创作纪念日和前端碎碎念

机缘 作为一个前端开发者,我一直热衷于将设计和技术相结合,尽可能提升用户体验。我最初成为创作者的初心源于学习记录,把创作当作一个笔记,希望把自己遇到的问题,以及学习到的实用技巧记录下来,方便学习回…

Kafka下载安装及基本使用

目录 Kafka介绍 消息队列的作用 消息队列的优势 应用解耦 异步提速 削峰填谷 为什么要用Kafka Kafka下载安装 Kafka快速上手(单机体验) 1. 启动zookeeper服务 2. 启动kafka服务 3. 简单收发消息 Kakfa的消息传递机制 Kafka介绍 Apache Kafka…