10 索引优化与查询优化

文章目录

  • 索引失效案例
  • 关联查询优化
      • 对于左外连接
      • 对于内连接
      • JOIN语句原理
        • 简单嵌套循环连接SNLJ
        • 索引嵌套循环连接INLJ
        • 块嵌套循环连接BNLJ
        • Hash Join
  • 子查询优化
  • 排序优化
      • filesort算法:双路排序和单路排序
  • 分组优化
  • 分页优化
  • 优先考虑覆盖索引
  • 索引下推ICP
      • 使用条件
  • 其他查询优化策略

MySQL中提高性能的最有效的方式是对数据表设计合理的索引,使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。如果查询时没有使用索引,查询语句就会扫描表中的所有记录,在数据量大的情况下,这样查询的速度就会很慢。

大多数情况下默认采用B+树来构建索引。

索引是否采用是由基于cost开销的优化器决定的,另外,是否使用索引跟数据库版本、数据量和数据选择度都有关系。

索引失效案例

  1. 全值匹配我最爱

  2. 最佳左前缀法则
    MySQL中一个索引可以包括16个字段,它检索数据时遵守最佳左前缀匹配原则,即从联合索引的最左边字段开始匹配
    用户在创建索引时,对于多列索引,过滤条件要使用索引必须按照索引建立的顺序,依次满足,一旦跳过某个字段,索引后面的字段都失效。如果查询条件中没有使用第一个字段,联合索引不会被使用

  3. 主键插入顺序
    如果插入的主键值忽大忽小,则可能会造成页分裂和记录移位

  4. 计算、函数会导致索引失效

  5. 类型转换(自动或手动)导致索引失效

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

  7. 不等于(≠或<>)索引失效

  8. is null可以使用索引,is not null索引失效

  9. LIKE以通配符%开头索引失效

  10. OR前后存在非索引的列索引失效

  11. 数据库和表的字符集统一使用utf8mb4

关联查询优化

对于左外连接

SELECT * FROM `type` LEFT JOIN book ON type.card = book.card;

type相当于驱动表,book相当于被驱动表
如果左连接中,只能给一个字段添加索引,就要添加给被驱动表,原因是左连接左边一定都有,关键在于如何从右表搜索行。

对于内连接

由查询优化器来决定谁作为驱动表,谁作为被驱动表出现
如果表的连接条件只能有一个字段有索引,则有索引的字段所在的表会作为被驱动表
在两个表都存在索引的情况下,会选择小表作为驱动表

JOIN语句原理

简单嵌套循环连接SNLJ
索引嵌套循环连接INLJ

优化思路是减少内层表数据的匹配次数,所以要求是被驱动表上必须有索引
在这里插入图片描述

块嵌套循环连接BNLJ

如果被驱动表中没有索引,那么被扫描的次数太多了,IO次数也很多。
优化思路是减少被驱动表的IO次数,一块一块地获取驱动表的数据。引入join buffer缓冲区,将驱动表相关的部分数据列缓冲到join buffer中,然后全盘扫描被驱动表,被驱动表中的每一条记录一次性跟buffer中的所有驱动表记录进行匹配,降低了被驱动表的访问频率

在这里插入图片描述

Hash Join

是做大数据集连接时常用方式,优化器将相对较小的表在内存中建立散列值,然后扫描较大的表并探测散列值,找出与Hash表匹配的行

  1. 这种方式适用于较小的表完全可以放入内存中的情况,这样总成本就是访问两个表的成本之和

  2. 若表很大不能完全放入内存,这是优化器会将其分割成若干个不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段

  3. 能够很好的工作于没有索引的大表和并行查询的环境中,并提供很好的性能。

  4. 只能应用于等值连接,这是由hash的特点决定的

子查询优化

概念:一个SELECT查询的结果作为另一个SELECT语句的条件,使用子查询可以实现查询语句的嵌套查询

子查询的执行效率不高的原因:1.MySQL需要为内层查询语句的查询结果建立一个临时表,然后外层查询语句从临时表中查询记录,查询完毕后再撤销这些临时表。这样会消耗过多的CPU和IO资源,产生大量的慢查询
2.子查询结果集存储的临时表,不会存在索引,所以查询性能会收到影响
3.对于返回结果较大的子查询,其对查询性能的影响也就越大

使用连接查询代替子查询

SELECT * FROM student stu 
WHERE stu.stuno IN (SELECT monitor FROM class cWHERE monitor IS NOT NULL
);SELECT stu.* FROM student stu 
JOIN class c ON stu.stuno=c.monitor 
WHERE c.monitor IS NOT NULL
SELECT stu.* FROM student stu 
WHERE stu.stuno NOT IN (SELECT monitor FROM class cWHERE monitor IS NOT NULL
);SELECT stu.* FROM student stu 
LEFT OUTER JOIN class c ON stu.stuno=c.monitor 
WHERE c.monitor IS NOT NULL

排序优化

排序使用索引的原因:索引可以保证数据的有序性,效率更高,filesort排序一般在内存中进行,占用CPU较多,如果待排序结果较大,会产生临时文件IO到磁盘进行排序的情况,效率较低。

  1. 增加LIMIT过滤条件索引有效

  2. 保证字段顺序索引有效

  3. 升序降序一致或顺序全不一致索引有效

filesort算法:双路排序和单路排序

双路排序:扫描磁盘读取order列,在buffer中进行排序,再按照排序列表从磁盘中读取其他字段

单路排序:从磁盘读取所有列,在buffer中按照order进行排序,之后输出。它的效率更快一点,避免了第二次读取数据,并且把随机IO变成了顺序IO,但是他会使用更多的空间

分组优化

类似于排序优化

分页优化

  1. 在索引上完成排序分页操作,然后根据主键关联回原表查询所需要的其他列内容

  2. 将LIMIT查询转换为某个位置的查询

优先考虑覆盖索引

概念:建索引的字段覆盖了查询条件所涉及的字段。索引的叶子节点存储了所需要的数据,通过读取索引就可以得到所需数据无需回表

好处:避免进行回表;可以把随机IO变成顺序IO

弊端:索引字段的维护是有代价的

索引下推ICP

是MySQL5.6的新特性,是一种在存储引擎层使用索引过滤数据的优化方式。ICP可以减少回表的次数以及MySQL服务器访问存储引擎的次数

启用ICP后,如果WHERE条件可以使用索引中的列进行筛选,则MySQL服务器会把这部分条件使用索引条目进行筛选数据,最后才回表读取数据

使用条件

  1. 只能用于二级索引

  2. EXPLAIN显示的执行计划中type值为range、ref、eq_ref和ref_or_null

  3. 只有在索引列中的WHERE条件字段才可以用ICP筛选

  4. ICP可以用于MyISAM和InnoDB存储引擎

  5. 当SQL使用覆盖索引时,不支持ICP优化方法

  6. 相关子查询条件不能使用ICP

其他查询优化策略

  1. EXISTS和IN的区分
    SELECT * FROM A WHERE cc IN (SELECT cc FROM B),哪个表小就用哪个表来驱动,A表小就用EXISTS,B表小就用IN

  2. COUNT()、COUNT(1)和COUNT(具体字段)的效率
    · COUNT(
    )和COUNT(1)都是统计所有结果,本质上没有区别,如果有WHERE子句,则是对所有符合条件的数据行进行统计,如果没有WHERE子句,则是对数据表的数据行数进行统计
    · 如果是MyISAM,统计数据表的行数只需要O(1)的复杂度,因为每个数据表都有一个meta信息存储了row_count值,其一致性由表级锁保证;如果是InnoDB,因为其支持事务,采用行级锁和MVCC机制,无法维护一个row_count变量,因此需要扫描全表,是O(n)的复杂度
    · 在InnoDB中,如果采用COUNT(具体字段)来统计具体数据行数,尽量采用二级索引。因为聚簇索引包含的信息多。对于COUNT(*)、COUNT(1),不需要查找具体的行,只是统计行数,系统会自动采用空间更小的二级索引来统计

  3. SELECT(*)
    尽量不要使用**,因为需要通过查询数据字典转换为所有列名,这会耗费资源和时间;且无法使用覆盖索引

  4. LIMIT 1对优化的影响
    针对全盘扫描,如果确定结果集只有一条,加上LIMIT 1,扫描到一条结果就不会再扫描,这样会加快查询速度。如果对字段已经建立了唯一索引,则不会进行全盘扫描,不需要加LIMIE 1

  5. 多使用COMMIT
    程序性能会得到提高,需求会因为COMMIT所释放的资源而减少。COMMIT所释放的资源有:回滚段上用于恢复数据的信息,被程序语句获得的锁,redo / undo log buffer中的空间,管理上述3中资源的内部花费

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

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

相关文章

最新、最全、最详细的 K8S 学习笔记总结

Kubernetes就是一个编排容器的工具&#xff0c;一个可以管理应用全生命周期的工具&#xff0c;从创建应用&#xff0c;应用的部署&#xff0c;应用提供服务&#xff0c;扩容缩容应用&#xff0c;应用更新&#xff0c;都非常的方便&#xff0c;而且可以做到故障自愈。 K8S的前景…

笔记50:正则表达式入门宝典

引自&#xff1a;正则表达式是什么? - 知乎 中“龙吟九野”所写的一个回答&#xff0c;个人感觉看完之后如同醍醐灌顶&#xff0c;查了很多资料都没有这篇文章写的基础和通透&#xff0c;感觉是正则表达式扫盲好文&#xff0c;所以搬运一下&#xff0c;侵权删&#xff0c;感谢…

面向萌新的数学建模入门指南

时间飞逝&#xff0c;我的大一建模生涯也告一段落。感谢建模路上帮助过我的学长和学姐们&#xff0c;滴水之恩当涌泉相报&#xff0c;写下这篇感想&#xff0c;希望可以给学弟学妹们一丝启发&#xff0c;也就完成我的想法了。拙劣的文笔&#xff0c;也不知道写些啥&#xff0c;…

Hadoop知识点全面总结

文章目录 什么是HadoopHadoop发行版介绍Hadoop版本演变历史Hadoop3.x的细节优化Hadoop三大核心组件介绍HDFS体系结构NameNode介绍总结 SecondaryNameNode介绍DataNode介绍DataNode总结 MapReduce介绍分布式计算介绍MapReduce原理剖析MapReduce之Map阶段MapReduce之Reduce阶段 实…

MySQL的event的使用方法

MySQL的event的使用方法 一、事件定时策略 1、查看event事件开启状态 SHOW VARIABLES LIKE event_scheduler;如图&#xff0c;Value值 ON&#xff1a;打开&#xff0c;OFF&#xff1a;关闭。 2、设置event事件打开 SET GLOBAL event_scheduler ON;如果MySQL重启了&#x…

vSLAM中IMU预积分的作用--以惯性导航的角度分析

作为一个学过一点惯导的工程师&#xff0c;在初次接触视觉slam方向时&#xff0c;最感兴趣的就是IMU预积分了。但为什么要用这个预积分&#xff0c;在看了很多材料和书后&#xff0c;还是感觉模模糊糊&#xff0c;云里雾里。 在接触了vSLAM的更多内容后&#xff0c;站在历史研究…

极简web集成 rtsp/rtmp免插件播放,web rtsp/rtmp推流方案

一直有客户要求在Web上集成rtsp/rtmp播放和web推流功能,测试对比各种流服务平台和播放器后&#xff0c;发现在github的ovsyunlive不管是延时&#xff0c;便捷和集成易用性都是非常好&#xff0c;还是看效果吧&#xff0c;直接下载测试如下&#xff1a; github 搜ovsyunlive下载…

STM32 IAP应用开发--bootloader升级程序

STM32 IAP应用开发--bootloader升级程序 Chapter1 STM32 IAP应用开发——通过串口/RS485实现固件升级&#xff08;方式2&#xff09;前言什么是IAP&#xff1f;什么是BootLoader&#xff1f; 方案介绍&#xff1a;1&#xff09;bootloader部分&#xff1a;2&#xff09;APP部分…

纷享销客获评中小企业数字化转型优质服务商

近日&#xff0c;纷享销客成功入选长沙市工信局评定的【中小企业数字化转型优质服务商】&#xff0c;专业服务实力得到官方认可&#xff01; 今年6月&#xff0c;财政部、工信部联合印发《关于开展中小企业数字化转型城市试点工作的通知》&#xff0c;长沙市成功入选首批中小企…

程序员笔记本电脑选 windows 还是 MAC

计算机选择是每个进入 IT 行业同学的第一个重要选择&#xff0c;那么你是怎么选择的呢&#xff1f; 选择操作系统&#xff08;Windows还是macOS&#xff09;取决于程序员的需求、偏好和工作流程。每个操作系统都有其优点和缺点&#xff0c;下面将分别讨论它们&#xff0c;以帮助…

RK3568驱动指南|第七篇 设备树-第61章 实例分析:pinctrl

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Redis注解式开发结合SSM项目使用与Quartz框架介绍以及击穿、穿透、雪崩问题解决

目录 一、SSM项目整合Redis 1.1 导入pom依赖 1.2 spring-redis.xml 1.3 spring上下文配置 二、Redis注解式开发 2.1 Cacheable 注解 2.2 自定义策略 2.3 CachePut 注解 三、Redis中缓冲、击穿、穿透、雪崩问题解决 3.1 缓冲问题 —— Quartz 框架 3.2 常见的三种问题…

Git查询某次提交属于哪个分支

在Android studio&#xff08;JetBrains系列也类似&#xff09;左下角&#xff0c;可以看到所有提交信息。 选中某一次提交信息&#xff0c;右键&#xff0c;选择“Copy Revision Number”&#xff0c;如下图&#xff1a; 打开Android studio的Terminal&#xff0c;输入git b…

【广州华锐互动】3D全景虚拟旅游在文旅行业的应用场景

随着科技的不断发展&#xff0c;3D全景虚拟旅游正在成为一种新兴的旅游体验方式&#xff0c;它可以帮助旅游者更加深入地了解旅游信息&#xff0c;提升旅游体验。下面我们将详细介绍3D全景虚拟旅游可以应用于哪些场景。 一、旅游规划 3D全景虚拟旅游可以帮助旅游者更加直观地进…

SQL数据库使用方法

首先打开sqlite3.exe所在文件夹&#xff0c;如图1 图1 在文件夹路径中将路径改为cmd&#xff0c;如图2所示 图2 在弹出的cmd窗口中输入如图3所示。 图3 sqlite3 tichiceliang.db 其中tichiceliang是数据库名称。然后按enter&#xff0c;再在cmd中输入.table,可以看到文件夹目…

PC9502双节锂电池充电管理芯片高精度外围元件少SOP8封装

■ 产品概述 PC9502 系列是一款双节锂电池充电管理芯片。 该芯片 包含了充电状态检测、充电过程、温度检测等&#xff0c;内部还集成 一个高精度的基准电压模块&#xff0c;此芯片采用 SOP-8 封装。 PC9502 充电包含三种模式&#xff1a;预充电&#xff0c;恒流充电&#x…

Cassandra介绍(二)

1.8. 数据 存储 &#xff08; CommitLog、MemTable、SSTable &#xff09; 写请求分别到 CommitLog 和 MemTable, 并且 MemTable 的数据会刷写到磁盘 SSTable 上. 除 了写数据,还有索引也会保存到磁盘上. 先将数据写到磁盘中的 commitlog&#xff0c;同时追加到中内存中的数据…

通过you-get命令行工具下载B站等常见网站高清视频

参考&#xff1a; you-get&#xff1a;https://github.com/soimort/you-get EditThisCookie 源码&#xff1a;https://github.com/ETCExtensions/Edit-This-Cookie EditThisCookie 官网&#xff1a;https://www.editthiscookie.com/ you-get 是一个非常好用的命令行版视频下载工…

分享98个节日庆典PPT,总有一款适合您

分享98个节日庆典PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1gNj_uRLz9a5uTG97ezma7Q?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

Django初窥门径-自定义用户模型

前言 自定义用户模型在Django应用中是一个重要的话题&#xff0c;它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中&#xff0c;我将讲述为什么自定义用户模型是如此重要以及其潜在的优势&#xff1a; 随着Web应用的不断发展&…