第10章_索引优化与查询优化(覆盖索引, 索引下推等)

news2024/10/7 4:28:13

4. 子查询优化

MySQL 4.1 版本开始支持子查询,使用子查询可以进行 SELECT 语句的嵌套查询,即一个 SELECT 查询的结果作为另一个SELECT 语句的条件。 子查询可以一次性完成很多逻辑上需要多个步骤才能完成的 SQL 操作
子查询是 MySQL 的一项重要的功能,可以帮助我们通过一个 SQL 语句实现比较复杂的查询。但是,子 查询的执行效率不高。 原因:
① 执行子查询时, MySQL 需要为内层查询语句的查询结果 建立一个临时表 ,然后外层查询语句从临时表中查询记录。查询完毕后,再 撤销这些临时表 。这样会消耗过多的 CPU IO 资源,产生大量的慢查询。
② 子查询的结果集存储的临时表,不论是内存临时表还是磁盘临时表都 不会存在索引 ,所以查询性能会受到一定的影响。
③ 对于返回结果集比较大的子查询,其对查询性能的影响也就越大。
MySQL 中,可以使用连接( JOIN )查询来替代子查询。 连接查询 不需要建立临时表 ,其 速度比子查询要快 ,如果查询中使用索引的话,性能就会更好。
结论:尽量不要使用NOT IN 或者 NOT EXISTS,用LEFT JOIN xxx ON xx WHERE xx IS NULL替代

8.优先考虑覆盖索引

8.1 什么是覆盖索引?

理解方式一 :索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。 一个索引包含了满足查询结果的数据就叫做覆盖索引。
理解方式二 :非聚簇复合索引的一种形式,它包括在查询里的 SELECT JOIN WHERE 子句用到的所有列 (即建索引的字段正好是覆盖查询条件中所涉及的字段)。
简单说就是, 索引列 + 主键 包含 SELECT FROM 之间查询的列

8.2 覆盖索引的利弊

好处:
1. 避免 Innodb 表进行索引的二次查询(回表)
2. 可以把随机 IO 变成顺序 IO 加快查询效率
弊端:
索引字段的维护 总是有代价的。因此,在建立冗余索引来支持覆盖索引时就需要权衡考虑了。这是业务 DBA,或者称为业务数据架构师的工作。

10. 使用索引下推

Index Condition Pushdown(ICP) MySQL 5.6 中新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。ICP 可以减少存储引擎访问基表的次数以及 MySQL 服务器访问存储引擎的次数。

10.1 使用前后的扫描过程对比

在不使用 ICP 索引扫描的过程:
storage 层:只将满足 index key 条件的索引记录对应的整行记录取出,返回给 server
server 层:对返回的数据,使用后面的 where 条件过滤,直至返回最后一行。
server层在生成执行计划后, 按如下步骤执行查询:
1. server层首先调用存储引擎的接口进行读数据(read data)==>定位到满足条件的第一条二级索引记录(Read index)
2. 根据B+树索引快速定位到这条二级索引记录后, 根据二级索引记录的主键值进行回表操作(get records),将完整的用户记录返回给存储引擎(Load data), 将完整记录返回给server层
3. server层再根据using where 判断其他搜索条件是否成立, 如果成立则将其发送给其他客户端; 否则向存储引擎要下一条数据
4. 由于每条记录都有next_record 属性, 根据该属性定位下一条符合条件的二级索引记录 
下图即Using prefix index to get records过程
使用 ICP 扫描的过程:
storage 层:
首先将 index key 条件满足的索引记录区间确定,然后在索引上使用 index filter对每条记录 进行过滤。将满足的 index filter条件的索引记录才去回表取出整行记录返回 server 层。不满足 index filter 条件的索引记录丢弃,不回表、也不会返回server 层, 之后判断下一条数据。
server 层:
对返回的数据,使用 table filter 条件做最后的过滤。
server层在生成执行计划后, 按如下步骤执行查询:
1. server层首先调用存储引擎的接口进行读数据(read data)==>定位到满足条件的第一条二级索引记录(Read index)
2. 根据B+树索引快速定位到这条二级索引记录后, 先不进行回表操作(get records),而是 先判断一下所有关于索引中包含的列的条件( 就是假如使用的是联合索引, 而其他条件所在列恰好也在联合索引内)是否成立(Using index condition), 如果不成立, 直接跳过不再回表, 如果成立, 正常回表并将完整的用户记录返回给存储引擎(Load data), 将完整记录返回给server层
3. server层再判断其他搜索条件( 不在联合索引内,如果有这样的条件还要加上using where)是否成立, 如果成立则将其发送给其他客户端; 否则向存储引擎要下一条数据
4. 由于每条记录都有next_record 属性, 根据该属性定位下一条符合条件的二级索引记录, 并继续上述操作
下图即 Using index condition 操作

 

使用前后的成本差别
使用前,存储层多返回了需要被 index filter 过滤掉的整行记录
使用 ICP 后,直接就去掉了不满足 index filter 条件的记录,省去了他们回表和传递到 server 层的成本。
ICP 加速效果 取决于在存储引擎内通过 ICP 筛选 掉的数据的比例。

10.2 ICP的使用条件

ICP 的使用条件:
① 只能用于二级索引 (secondary index)  毕竟一级索引也不需要回表
explain 显示的执行计划中 type 值( join 类型)为 range ref eq_ref 或者 ref_or_null
③ 并非全部 where 条件都可以用 ICP 筛选,如果 where 条件的字段不在索引列中,还是要读取整表的记录到server 端做 where 过滤。
ICP 可以用于 MyISAM InnnoDB 存储引擎
MySQL 5.6 版本的不支持分区表的 ICP 功能, 5.7 版本的开始支持。
⑥ 当 SQL 使用覆盖索引时,不支持 ICP 优化方法。

10.3 ICP使用案例

12. 其它查询优化策略 

12.1 EXISTS IN 的区分  

问题:
不太理解哪种情况下应该使用 EXISTS,哪种情况应该用 IN。选择的标准是看能否使用表的索引吗?
这两条语句有一些区别 : 上面的是不相关子查询, 需要从内部查出数据给外边用
                                     : 下面的是相关子查询, 需要从外部传入数据给内部用

    

12.2 COUNT(*)COUNT(具体字段)效率 

面试经常问

问:在 MySQL 中统计数据表的行数,可以使用三种方式: SELECT COUNT(*) SELECT COUNT(1) SELECT COUNT(具体字段 ) ,使用这三者之间的查询效率是怎样的?

12.3 关于SELECT(*)

在表查询中,建议明确字段,不要使用 * 作为查询的字段列表,推荐使用 SELECT < 字段列表 > 查询。原因:
MySQL 在解析的过程中,会通过 查询数据字典 "*" 按序转换成所有列名,这会大大的耗费资源和时
间。
② 无法使用 覆盖索引

12.5 多使用COMMIT

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

3 join语句原理

我碰见题时候再来补充

4. 排序优化

同上

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

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

相关文章

第 361 场周赛 (AC 1,第二题过了但是考试结束了)

7020.统计对称整数的数目 思路一&#xff1a;指定区间统计对称整数 1.遍历区间2.判断该数对不对称 对称逻辑&#xff1a;首尾同时开始遍历&#xff0c;并且同时累加为两个数&#xff0c;最后判断两个数是否相等 class Solution { public:bool judge(int num){if(num<10) …

AUTOSAR PN介绍

为了在总线通信激活情况下实现节能目的,AUTOSAR提出了PN(Partial Networking)。 PN主要作用 允许跨网络关闭多个ECU的通信,而其他ECU继续保持通信使用NM消息在参与的ECU之间传递PNC(Partial Network Cluster)的请求/释放信息。PN的好处 使用PN的最大好处是可以使当前功能…

算法通关村第11关【白银】| 位运算高频算法题

一、移位的妙用 1.位1的个数 思路&#xff1a; 利用一个数和1与操作&#xff0c;结果就是最低位的特点&#xff0c;每次右移都能知道一位是不是1 public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int count 0;for(in…

密码学入门——环游密码世界

文章目录 参考书目一、基本概念1.1 本书主要角色1.2 加密与解密 二、对称密码与公钥密码2.1 密钥2.2 对称密码和公钥密码2.3 混合密码技术 三、其他密码技术 参考书目 图解密码技术 第三版 一、基本概念 1.1 本书主要角色 1.2 加密与解密 加密 解密 密码破译 二、对称密…

grid网格布局的使用?

一、定义 CSS 网格是一个用于 web 的二维布局系统。利用网格&#xff0c;你可以把内容按照行与列的格式进行排版。另外&#xff0c;网格还能非常轻松地实现一些复杂的布局。 网格是由一系列水平及垂直的线构成的一种布局模式。根据网格&#xff0c;我们能够将设计元素进行排列…

Ubuntu系统下使用宝塔面板实现一键搭建Z-Blog个人博客的方法和流程

文章目录 1.前言2.网站搭建2.1. 网页下载和安装2.2.网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测试5.结语 1.前言 Ubuntu系统作…

单向链表和双向链表的增删改查以及排序问题

文章目录 单向链表双向链表运行结果完整代码 本文介绍链表的增删改查以及排序问题&#xff0c;其中最重要的还是指针的使用&#xff01; 单向链表 定义一个单向链表&#xff0c;里面包含一个整型数据和一个指向后向的指针。 typedef struct linklist{int data;struct linkli…

InnoDB 的默认隔离级别是什么?

分析&回答 大部分数据库系统&#xff08;如Oracle&#xff09;都将都将读提交&#xff08;Read-Commited&#xff09;作为默认隔离级别&#xff0c;而MySQL却选择可重复读&#xff08;Repeatable-Read&#xff09;作为其默认隔离级别。 如果没有隔离级别基础知识的话先看…

数学建模之插值法

目录 1 插值法概述2 插值法原理3 拉格朗日插值4 牛顿插值5 三次Hermite插值&#xff08;重点&#xff09;6 三次样条插值&#xff08;重点&#xff09;7 各种插值法总结8 n 维数据的插值9 插值法拓展10 课后作业 1 插值法概述 数模比赛中&#xff0c;常常需要根据已知的函数点进…

【Unity3D赛车游戏优化篇】新【八】汽车实现镜头的流畅跟随,以及不同角度的切换

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

YOLOV8实例分割——详细记录环境配置、自定义数据处理到模型训练与部署

前言 Ultralytics YOLOv8是一种前沿的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它在前代YOLO版本的成功基础上进行了进一步的创新&#xff0c;引入了全新的特性和改进&#xff0c;以进一步提升性能和灵活性。作为一个高速、精准且易于操作的设计&#xff0c;YO…

合宙Air724UG LuatOS-Air LVGL API控件-标签 (Label)

标签 (Label) 标签是 LVGL 用来显示文字的控件。 示例代码 label lvgl.label_create(lvgl.scr_act(), nil) lvgl.label_set_recolor(label, true) lvgl.label_set_text(label, "#0000ff Re-color# #ff00ff words# #ff0000 of\n# align the lines …

Vision Transformer(VIT 网络架构)

论文下载链接&#xff1a;https://arxiv.org/abs/2010.11929 文章目录 引言1. VIT与传统CNN的比较2. 为什么需要Transformer在图像任务中&#xff1f; 1. 深入Transformer1.1 Transformer的起源&#xff1a;NLP领域的突破1.2 Transformer的基本组成1.2.1 自注意机制 (Self-Atte…

C++将派生类赋值给基类

在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍…

星际争霸之小霸王之小蜜蜂(十)--鼠道

系列文章目录 星际争霸之小霸王之小蜜蜂&#xff08;九&#xff09;--狂鼠之灾 星际争霸之小霸王之小蜜蜂&#xff08;八&#xff09;--蓝皮鼠和大脸猫 星际争霸之小霸王之小蜜蜂&#xff08;七&#xff09;--消失的子弹 星际争霸之小霸王之小蜜蜂&#xff08;六&#xff09;-…

大数据课程K20——Spark的SparkSql概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的SparkSQL由来; ⚪ 了解Spark的SparkSQL特点; ⚪ 了解Spark的SparkSQL优势; ⚪ 掌握Spark的SparkSQL入门; 一、SparkSQL概述 1. 概述 Spark为结构化数据处理引入了一个称…

SQLI-labs-第四关

知识点&#xff1a;get双引号(")和括号注入 思路&#xff1a; 1、判断注入点 首先&#xff0c;输入?id1 --&#xff0c;看看正常的回显状态 接着输入?id1 --&#xff0c;结果还是正常回显&#xff0c;说明这里不存在单引号问题 试试双引号&#xff0c;这里爆出了sql语…

深入了解GCC编译过程

关于Linux的编译过程&#xff0c;其实只需要使用gcc这个功能&#xff0c;gcc并非一个编译器&#xff0c;是一个驱动程序。其编译过程也很熟悉&#xff1a;预处理–编译–汇编–链接。在接触底层开发甚至操作系统开发时&#xff0c;我们都需要了解这么一个知识点&#xff0c;如何…

C# 如何读取dxf档案

需求来源&#xff1a; 工作中&#xff0c;客户提供一张CAD导出的dxf 档案&#xff0c;然后需要机器人将其转成点位&#xff0c;走到对应的位置。 下面介绍一下dxf档案到底是什么&#xff1f;以及语法规则。 dxf 格式介绍&#xff1a;DXF 格式 dxf LINE 格式。 其实上述文档…

软考:中级软件设计师:多媒体基础,音频,图像,颜色,多媒体技术的种类,图像音频视频的容量计算,常见的多媒体标准

软考&#xff1a;中级软件设计师:多媒体基础 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &am…