IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> mysql 索引失效分析 -> 正文阅读

[大数据]mysql 索引失效分析

mysql 索引失效分析如下:

1、联合索引(多个字段组成的索引)----->最佳左前缀法则查询从索引的最左前列开始并且不跳过索引中的列,中间有跳过的值,则其后面的索引会失效

?例如: 字段a,b,c按此顺序组成联合索引,

查询语句:

① select * from x where b=1 and c=1;

②??select * from x where c=1;

③??select * from x where c=2;

④? select * from x where a=1 and c=2;

⑤? select * from x where a=1 and b = 1 and c=2;

⑥ select * from x where a=1 and b >1 and c=2;

则①②③条查询语句都不走索引,因为字段a在创建索引排在第一个,如果没有他,联合索引不起效,切记跟创建索引的顺序有关

第④条语句,a字段走索引,c字段不走索引,因为a和c字段中间的b字段断开了,这b后面的字段索引都会失效

第5条语句,符合所有条件,所以a,b,c字段全都走索引

第6条语句, a,b字段走索引,c不走索引,主要是存储引擎不能使用索引中范围条件右边的列

?此情此景我想吟诗一首:火车跑的快,全靠头来带,中间数据变,后面止不前

2、范围查询( '<','>', 'like', 'in', 'or' )和联合索引中全值匹配

? ?①?select * from x where a>1 and b = 1 and c=2;

? ?② select * from x where a like 'tan%'?and b = 1 and c=2;

? ?③?select * from x where a in ('t1','t2')?and b >?1 and c=2;?

? ?④ select * from x where a = 't1' or a='t2'?and b = 1 and c=2;

? ?⑤?select id,a,b,c?from x where a = 't1' or a='t2'?and b = 1 and c=2;

? ? ? 如上情况,第①②③④条语句都不一定走索引,要根据字段a后面的条件,产生的结果集在整个x表里的占比情况,查询的结果集较大,而且查询出来后需要回表查询,效率不高,还没有进行全表扫描快,则不会走索引;如果结果集很少则会走索引,并且后面的字段范围查询不受影响,也依旧遵从最佳左前缀法则。

? ? ?第⑤条语句走索引,原因是全值匹配。首先回忆一下mysql的索引树,针对二级索引,我们查询的结果在联合索引的索引树上都有,因此直接遍历二级索引树就可获取到结果,无需回表操作,因此mysql选择使用二级索引。??

? ? 也就是说,某些场景我们是可以使用覆盖索引(即遍历索引树就可以取到返回的结果字段来进行优化的。

? ? ??

其实这里用到了索引下推,什么是索引下推?

? ? ? ?对于联合索引(a,b,c),按照最左前缀原则,sql语句 select * from x where a like 'tan%'?and b = 1 and c=2; 按道理说应该只能用到a字段,在a字段值不确认情况下,b和c字段是不走索引的,但是实际情况是走索引的(也有可能不走,上面已经提过原因,我们这里假设筛选后的结果集数据占比很小)。

? ? ? ?在Mysql5.6以前,是先走a索引,找到结果集,然后在回表,通过比较b和c字段确认查找的记录。

? ? ? 在Mysql5.6以后,先走a索引确定a的值,之后遍历二级索引树,根据b和c字段在过滤一遍,然后拿到结果集(过滤后的结果集会少很多)再去回表,这样提高回表时的效率。这就是索引下推。
?

注意通过前面2点我们可以清楚的明白,联合索引,最主要是判断首字段是否走索引,以及什么时候回表查询

3、索引列上做了操作(计算、函数、自动或手动类型转换等表达式),会导致索引失效而转向全表扫描

4、mysql在使用不等于(!= 或 <>)

? ? ?这种情况跟上面第二种范围查询一样,走不走索引要看不等式后的条件,产生的结果集是否占总数据大小情况,只是这种查询大多数情况都是占比很大,所以一般不会走索引

5、is null,is not null也无法使用索引

6、like以通配符开头('%abc..')也会导致索引失效

  通过覆盖索引可以解决like '%字符串%'索引失效的问题

  例:假设以name,age字段建索引

create index idx_user_nameAge on tb_user(name,age);

查询字段只要有一个和覆盖索引沾边就行

但如果有超过索引的部分,索引就用不上了,所以用select * 就不能使用覆盖索引

7、字符串不加单引号,该字段以后的索引失效

8、少用or,用它来连接时会索引失效

9、少数据值的列也不应该增加索引,只有两种情况,且平均分布,加了索引反而降低速度

10、range的包含范围有一定的阈值,超过会进行全文扫描

这是我总结的mysql索引失效情况,有不对或者需要补充的希望大家指正

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:32:57  更:2021-12-24 18:34:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:27:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码