【索引优化与查询优化】

文章目录

  • 1. 索引失效的案例
    • 1.1 最左优先
    • 1.2 主键插入顺序
    • 1.3 计算、函数、类型转换(自动或手动)导致索引失效
    • 1.4 范围条件右边的列索引失效
    • 1.5 非 条件索引失效
    • 1.6 like以通配符%开头索引失效
    • 1.7 OR 前后存在非索引的列,索引失效
  • 2. 关联查询优化
  • 3. 子查询优化
    • 3.1 子查询缺点
  • 4. 排序优化
  • 5. GROUP BY优化
  • 6. 优化分页查询
  • 7. 覆盖索引与索引下推
  • 8. 普通索引 vs 唯一索引
    • 8.1 查询过程
    • 8.2 更新过程

1. 索引失效的案例

1.1 最左优先

在这里插入图片描述

1.2 主键插入顺序

数据页和记录又是按照记录主键值从小到大的顺序进行排序,所以如果我们插入的记录的主键值是依次增大的话,那我们每插满一个数据页就换到下一个数据页继续插,而如果我们插入的主键值忽小忽大的话,就比较麻烦了,可能会造成页面分裂记录移位

  • 让主键具有 AUTO_INCREMENT ,让存储引擎自己为表生成主键,而不是我们手动插入

1.3 计算、函数、类型转换(自动或手动)导致索引失效

第一种:对索引字段作用函数,导致索引失效:
在这里插入图片描述
第二种 对索引字段计算,导致索引失效
在这里插入图片描述

第三种:类型转换导致索引失效
在这里插入图片描述

1.4 范围条件右边的列索引失效

(age、classId、name)的顺序创建的聚合索引
在这里插入图片描述
原因:因为前一个条件相同的情况下 当前条件才会是有序的。
当前一个条件不同 那么无法保证当前条件为有序的 所以索引失效

其实就是二级索引的话,如果都是等值判断的话,那是有序的,先查age,age选出一部分数据后再查classId,classId再筛选一部分后再查name;如果不是等值查询的话,比如说classId使用到了范围,那经过classId范围筛选出一部分数据后,此时对于classId后面的所有索引来说,此时的状态是无序的,关键字不是有序,只能逐个查找,导致索引失效。

1.5 非 条件索引失效

  • 不等于(!= 或者<>)索引失效
  • is null可以使用索引,is not null无法使用索引(相当于非条件)

1.6 like以通配符%开头索引失效

在这里插入图片描述

1.7 OR 前后存在非索引的列,索引失效

or其实就是取并集,两个条件的前面有索引,后面没有索引,但要取并集,还是要扫描全表,导致索引失效。
在这里插入图片描述
使用到了索引:而且是两个索引
在这里插入图片描述
你能看到这里使用到了 index_merge,简单来说index_merge就是对age和name分别进行了扫描,然后将这两个结果集进行了合并。这样做的好处就是 避免了全表扫描

2. 关联查询优化

  • 外连接
    • 右表是我们的关键点,一定需要建立索引 。
  • 内连接
    • 对于内连接来说,查询优化器可以决定谁作为驱动表,谁作为被驱动表出现的
    • 小表驱动大表
    • 被驱动表创建索引

Join语句的原理

  • Simple Nested-Loop Join(索引嵌套循环连接)外表取一个记录,内表都拿过来判断
  • Index Nested-Loop Join(索引嵌套循环连接)外表取一个记录,根据拿到的匹配字段走索引,再将索引查出来的进行匹配
  • Block Nested-Loop Join(块嵌套循环连接)驱动表批量加载到join buffer中,外表加载一定的次数,进行批量匹配,这个一定次数是基于驱动表分几次可以加载到join buffer中的

Mysql8之后: Hash Join

3. 子查询优化

3.1 子查询缺点

  • 执行子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表,然后外层查询语句从临时表中查询记录。查询完毕后,再撤销这些临时表。这样会消耗过多的CPU和IO资源,产生大量的慢查询。
  • 子查询的结果集存储的临时表,不论是内存临时表还是磁盘临时表不会存在索引,所以查询性能会受到一定的影响。

结论:尽量不要使用NOT IN 或者 NOT EXISTS,用LEFT JOIN xxx ON xx WHERE xx IS NULL替代

4. 排序优化

问题:在 WHERE 条件字段上加索引,但是为什么在 ORDER BY 字段上还要加索引呢?
where先根据索引查到了数据,但如果ORDER BY字段没有加索引的话,查到的这些数据对于ORDER BY的字段来说的话是乱序的,要重新排序后再返回sql语句的结果。

在MySQL中,支持两种排序方式,分别是 FileSort 和 Index 排序。

排序中的索引失效问题:
在这里插入图片描述
在这里插入图片描述

优化建议:

  1. SQL 中,可以在 WHERE 子句和 ORDER BY 子句中使用索引,目的是在 WHERE 子句中 避免全表扫描,在 ORDER BY 子句避免使用 File Sort 排序。当然,某些情况下全表扫描,或者 File Sort 排序不一定比索引慢。但总的来说,我们还是要避免,以提高查询效率。

  2. 尽量使用 Index 完成 ORDER BY 排序。如果 WHERE 和 ORDER BY 后面是相同的列就使用单索引列;如果不同就使用联合索引。

  3. 无法使用 Index 时,需要对 File Sort 方式进行调优。

5. GROUP BY优化

  • group by 使用索引的原则几乎跟order by一致 ,group by 即使没有过滤条件用到索引,也可以直接使用索引。

  • group by 先排序再分组,遵照索引建的最佳左前缀法则

  • 当无法使用索引列,可以增大max_length_for_sort_data和sort_buffer_size参数的设置

  • where效率高于having,能写在where限定的条件就不要写在having中了

  • 减少使用order by,和业务沟通能不排序就不排序,或将排序放到程序端去做。Order by、group by、distinct这些语句较为耗费CPU,数据库的CPU资源是极其宝贵的。

  • 包含了order by、group by、distinct这些查询的语句,where条件过滤出来的结果集请保持在1000行以内,否则SQL会很慢。

6. 优化分页查询

问题:此时需要MySQL排序前2000010记录,仅仅返回2000000 -2000010的记录,其他记录丢弃,查询排序的代价非常大。在这里插入图片描述
在这里插入图片描述

7. 覆盖索引与索引下推

口述:覆盖索引和索引下推其实最初思想其实是差不多的,都是为了避免或者减少这种回表的次数,因为回表嘛,其实就是从二级索引中拿到主键,再回表,查询出详细的数据,回表其实是一个随机的IO,因为我们从二级索引查出的这个主键不是有序的,那回表就可能页在左边或者中间或者右边,是相当分散的,所以要尽量的避免。

索引覆盖其实就是针对我们的二级索引,当我们select字段是聚合索引的一部分,当然主键那也可以,那我们根据where啊这种根据索引找到数据后,按道理来说是要拿到主键再回表的,但我们select字段是聚合索引的一部分,其实二级索引的B+tree中就会存储聚合索引的消息,压根不需要回表,其实这个就是索引覆盖,就是不用回表了。

索引下推的话,其实本质来说还是要减少回表的次数的,其实就是将我们的条件提前到了回表之前,按道理我们用一个索引查出数据后,要回表查详细数据,这里的话其实索引下推针对的是聚合索引,比如a b c三个条件构成聚合索引,先按a索引查到数据,索引下推其实是用在聚合索引后面字段失效的情况下的,因为其实如果不失效的话,那它根本不会走索引下推,之间走聚合索引的ok了,索引下推是聚合索引后面字段索引失效了,将后续条件的判断提前到回表之前,进一步筛选掉一部分数据后再回表,也是减少回表要查的数据量的,因为回表其实是相当于一种随机IO嘛,性能很差,索引下推也是优化器来优化性能的。

ICP的使用条件:

  • 如果表访问的类型为range、ref、eq_ref和ref_or_null可以使用ICP

  • ICP可以用于 InnoDB 和 MyISAM 表,包括分区表InnoDB和 MyISAM表

  • 对于 InnoDB 表,ICP仅用于 二级索引 。ICP的目标是减少全行读取次数,从而减少I/O操作。

  • 当SQL使用覆盖索引时,不支持ICP。因为这种情况下使用ICP不会减少I/O。

  • 相关子查询的条件不能使用ICP

8. 普通索引 vs 唯一索引

8.1 查询过程

影响微乎其微

8.2 更新过程

  • 其实,这两类索引在查询能力上是没差别的,主要考虑的是对 更新性能 的影响。所以,建议你尽量选择普通索引
  • 普通索引 可以使用change buffer ,对于 数据量大 的表的更新优化还是很明显的。唯一索引不能使用

change buffer其实就是:当更新时,先写入change buffer,不同步磁盘,当下一次这个页从磁盘读入内存时,对这个页执行change buffer修改的操作,实现数据的一致性。

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

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

相关文章

6.一维数组——用冒泡法,选择法将5个整数由大到小排序

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码&#xff08;冒泡法&#xff09;程序运行代码&#xff08;选择法&#xff09; 前言 本系列为一维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 用冒泡法将5个整数由大到小排序 二、题目…

RK3568 android11 实现双路I2C触摸 --GT9xx

一&#xff0c;GT911 触摸屏简介 它的接口类型为 I2C &#xff0c;供电电压和通讯电压均为 3.3V 。这款电容触摸屏内置了上拉电阻&#xff0c;这意味着我们的开发板上与该触摸屏的接口处不需要设置上拉电阻。关于线序&#xff0c;同样是 GT911 &#xff0c;不同批次的器件都有…

【代码】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法matlab/yalmip+cplex/gurobi

程序名称&#xff1a;数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;数据驱动的分布鲁棒优化算法。考虑四个离散场景&#xff0c;模型采用列与约束生成(CCG)算法进行迭代求解&#xff0c;场景分…

使用docker-compose优雅部署nacos

查看代码中引入nacos版本 在应用的pom.xml中搜索nacos关键字&#xff0c;找到相关的nacos依赖 点击以来左边的图标&#xff0c;找到依赖管理器中的pom.xml&#xff0c;并全局搜索nacos&#xff0c;即可找到对应的nacos客户端版本 使用docker-compose部署nacos version: 3s…

Kafka事务机制:原理和实践

Kafka事务机制&#xff1a;原理和实践 Apache Kafka 是一个分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流应用程序。它不仅以高吞吐量、可扩展性和容错能力著称&#xff0c;还提供了事务支持&#xff0c;以确保数据的完整性和一致性。在这篇博客中&#xff0c;我…

ShaderBook

一、绘制 &#xff08;一&#xff09;颜色 颜色混合 vec3 colorA vec3(0.149,0.141,0.912); vec3 colorB vec3(1.000,0.833,0.224);//pct&#xff1a;混合因子float pct abs(sin(u_time)); //mix():将两个颜色进行混合&#xff0c;实现伴随时间变化的过渡效果color mix(…

解决electron-build打包后运行app报错:cannot find module xxx

现象&#xff1a; 关于这个问题查了很多资料&#xff0c;也问了chatgpt都没有找到答案。 最后只能靠自己了。 于是冷静下来回想一下细节。突然发现了一个特别点。 eletron-builder打包时&#xff0c;强制要求eletron-builder和eletron必须都放在devDependencies 否则&#…

面试篇spark(spark core,spark sql,spark 优化)

一&#xff1a;为什么学习spark&#xff1f; 相比较map-reduce框架&#xff0c;spark的框架执行效率更加高效。 mapreduce的执行框架示意图。 spark执行框架示意图 spark的执行中间结果是存储在内存当中的&#xff0c;而hdfs的执行中间结果是存储在hdfs中的。所以在运算的时…

vue3中toRaw 与 markRaw

toRaw 返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。 这是一个还原方法&#xff0c;可用于临时读取&#xff0c;访问不会被代理/跟踪&#xff0c;写入时也不会触发界面更新。 markRaw 标记一个对象&#xff0c;使其永远不会转换为代理。返回对象本身 应…

QT如何打包生成独立可执行.exe文件

一、将QT程序使用Release编译 二、新建一个文件夹&#xff0c;将Release编译生成的exe文件复制到新建文件夹中 先找到Release编译生成的exe文件夹位置&#xff0c;与项目创建的文件夹有关&#xff1a; 临时文件夹 --》 release --》 xx .exe文件 比如我的这个就是在D:\QtPro\b…

Martin Fowler:数字化时代,远程与本地协同工作孰优孰劣?(2)| IDCF

作者&#xff1a;Martin Fowler 译者&#xff1a;冬哥 原文&#xff1a;https://martinfowler.com/articles/remote-or-co-located.html &#xff08;接上篇 &#xff09; 二、大多数人在同地办公时工作效率更高 与软件开发中的许多主题一样&#xff0c;我不能拿 100 个软…

饰品价格持续下跌,steam搬砖还有搞头吗?

已经11月了&#xff0c;你手里的饰品出完了吗&#xff1f;csgo市场价格持续下跌&#xff0c;许多人听风就是雨&#xff0c;盲目跟风抛货、囤货&#xff0c;抛货是认为市场崩了&#xff0c;赶紧退场降低损失&#xff0c;不然会输得很惨&#xff0c;囤货的则认为有跌必有升&#…