10 索引优化与查询优化
文章目录
- 索引失效案例
- 关联查询优化
- 对于左外连接
- 对于内连接
- JOIN语句原理
- 简单嵌套循环连接SNLJ
- 索引嵌套循环连接INLJ
- 块嵌套循环连接BNLJ
- Hash Join
- 子查询优化
- 排序优化
- filesort算法:双路排序和单路排序
- 分组优化
- 分页优化
- 优先考虑覆盖索引
- 索引下推ICP
- 使用条件
- 其他查询优化策略
MySQL中提高性能的最有效的方式是对数据表设计合理的索引,使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。如果查询时没有使用索引,查询语句就会扫描表中的所有记录,在数据量大的情况下,这样查询的速度就会很慢。
大多数情况下默认采用B+树来构建索引。
索引是否采用是由基于cost开销
的优化器决定的,另外,是否使用索引跟数据库版本、数据量和数据选择度都有关系。
索引失效案例
-
全值匹配我最爱
-
最佳左前缀法则
MySQL中一个索引可以包括16个字段,它检索数据时遵守最佳左前缀匹配原则,即从联合索引的最左边字段开始匹配
用户在创建索引时,对于多列索引,过滤条件要使用索引必须按照索引建立的顺序,依次满足,一旦跳过某个字段,索引后面的字段都失效。如果查询条件中没有使用第一个字段,联合索引不会被使用 -
主键插入顺序
如果插入的主键值忽大忽小,则可能会造成页分裂和记录移位 -
计算、函数会
导致索引失效 -
类型转换
(自动或手动)导致索引失效 -
范围
条件右边的列索引失效 -
不等于
(≠或<>)索引失效 -
is null可以使用索引,
is not null
索引失效 -
LIKE以通配符
%开头
索引失效 -
OR
前后存在非索引的列索引失效 -
数据库和表的字符集统一使用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表匹配的行
-
这种方式适用于较小的表完全可以放入内存中的情况,这样总成本就是访问两个表的成本之和
-
若表很大不能完全放入内存,这是优化器会将其分割成若干个不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段
-
能够很好的工作于没有索引的大表和并行查询的环境中,并提供很好的性能。
-
只能应用于等值连接,这是由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到磁盘进行排序的情况,效率较低。
-
增加
LIMIT过滤
条件索引有效 -
保证
字段顺序
索引有效 -
升序降序一致或顺序全不一致
索引有效
filesort算法:双路排序和单路排序
双路排序:扫描磁盘读取order列
,在buffer中进行排序,再按照排序列表从磁盘中读取其他字段
单路排序:从磁盘读取所有列
,在buffer中按照order进行排序,之后输出。它的效率更快一点,避免了第二次读取数据,并且把随机IO变成了顺序IO,但是他会使用更多的空间
分组优化
类似于排序优化
分页优化
-
在索引上完成排序分页操作,然后根据主键关联回原表查询所需要的其他列内容
-
将LIMIT查询转换为某个位置的查询
优先考虑覆盖索引
概念:建索引的字段覆盖了查询条件所涉及的字段。索引的叶子节点存储了所需要的数据,通过读取索引就可以得到所需数据无需回表
好处:避免进行回表;可以把随机IO变成顺序IO
弊端:索引字段的维护是有代价的
索引下推ICP
是MySQL5.6的新特性,是一种在存储引擎层使用索引过滤数据的优化方式。ICP可以减少回表的次数
以及MySQL服务器访问存储引擎的次数
启用ICP后,如果WHERE条件可以使用索引中的列进行筛选,则MySQL服务器会把这部分条件使用索引条目进行筛选数据,最后才回表读取数据
使用条件
-
只能用于二级索引
-
EXPLAIN显示的执行计划中type值为range、ref、eq_ref和ref_or_null
-
只有在索引列中的WHERE条件字段才可以用ICP筛选
-
ICP可以用于MyISAM和InnoDB存储引擎
-
当SQL使用覆盖索引时,不支持ICP优化方法
-
相关子查询条件不能使用ICP
其他查询优化策略
-
EXISTS和IN的区分
SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
,哪个表小就用哪个表来驱动,A表小就用EXISTS,B表小就用IN -
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),不需要查找具体的行,只是统计行数,系统会自动采用空间更小的二级索引来统计 -
SELECT(*)
尽量不要使用**,因为需要通过查询数据字典转换为所有列名,这会耗费资源和时间;且无法使用覆盖索引 -
LIMIT 1对优化的影响
针对全盘扫描,如果确定结果集只有一条,加上LIMIT 1,扫描到一条结果就不会再扫描,这样会加快查询速度。如果对字段已经建立了唯一索引,则不会进行全盘扫描,不需要加LIMIE 1 -
多使用COMMIT
程序性能会得到提高,需求会因为COMMIT所释放的资源
而减少。COMMIT所释放的资源有:回滚段上用于恢复数据的信息,被程序语句获得的锁,redo / undo log buffer中的空间,管理上述3中资源的内部花费
相关文章:

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

linux PVE安装
先下载安装包: ISO - Proxmox Virtual Environment 普通电脑主机的话,做个U盘启动盘,进行刷机即可。 如果还没制作U盘启动盘,建议用这个,方便多个镜像切换 Download . Ventoy 按照刷机提示页面一步步配置即可&#…...

ZZ038 物联网应用与服务赛题第J套
2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (J卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用…...

【寒武纪(3)】媒体处理系统的系统控制、视频输入和后处理子系统
系统控制 文章目录 系统控制1、配置视频缓存池Video Pool2、配置硬件IP为在线工作(不通过DDR数据交互)/ 离线工作(写入DDR)模式3、硬IP可以使用 非Video Block (VB)内存4、配置是否启动内存传递的压缩 视频…...

Linux下使用vscode编写Python项目
我此处是使用VScode远程连接的服务器,具体方法可看如下: 1、vscode中安装Python插件 按上面步骤安装好Python插件后,重启vscode; 2、选择Python解释器 创建Python项目结构: 按下F1,打开vscode命令栏&am…...

使用 curator 连接 zookeeper 集群 Invalid config event received
dubbo整合zookeeper 如图,错误日志 2023-11-04 21:16:18.699 ERROR 7459 [main-EventThread] org.apache.curator.framework.imps.EnsembleTracker Caller0 at org.apache.curator.framework.imps.EnsembleTracker.processConfigData(EnsembleTracker.java…...

大促期间也要做好低价治理
低价链接无处不在,对于品牌来说,日常治理低价是常规操作,那面对价格变化更快、促销信息更丰富的大促,对低价的治理要求会更高。否则容易被未授权在大促双十一、六一八期间分食流量。 力维网络有专业的团队为品牌提供低价治理服务&…...

【c++】——类和对象(中)——默认成员函数(上)
【学习目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 目录 一.类的6个默认成员函数 二. 构造函数 2.1 概念 2.2.特性 三.析构函数 3.1.概念 3.2 特性 四.拷贝构造函数 4.1.概念 4.2.特性 一.类的6个默认成员函数 如果一个类中什么成员…...

钉钉企业微应用开发C#-HTTP回调接口
官方的STREAM回调推送的方式,试了几次都认证不过,就放弃了还是用HTTP的模式吧。 /// <summary>/// 应用回调/// </summary>/// <param name"model"></param>/// <returns></returns>public static Dictio…...

Rust编程基础之条件表达式和循环
1.if表达式 if 表达式允许根据条件执行不同的代码分支, 以下代码是一个典型的使用if表达式的例子: fn main() {let number 3; if number < 5 {println!("condition was true");} else {println!("condition was false");} } 所有的 if 表达式都以…...

MATLAB算法实战应用案例精讲-【人工智能】ROS机器人(补充篇)
目录 前言 ROS 机器人导航调参 1 速度和加速度 2 全局路径规划 3 局部路径规划...

基于8086汽车智能小车控制系统
**单片机设计介绍,基于8086汽车智能小车控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于 8086 的汽车智能小车控制系统是一种将微处理器技术应用于汽车控制的系统。下面是其主要的设计介绍: 硬…...

全光谱大面积氙光灯太阳光模拟器老化测试
氙灯光源太阳光模拟器广泛应用于光解水产氢、光化学催化、二氧化碳制甲醇、光化学合成、光降解污染物、 水污染处理、生物光照,光学检测、太阳能电池研究、荧光材料测试(透射、反射、吸收) 太阳能电池特性测试,光热转化,光电材料特性测试,生物…...

linux添加一条到中间路由器的路由
有时候需要配置一些明细路由,不能直接通过网关进行路由转发 配置示例 ip route add 10.0.12.0/24 via 10.0.41.1 dev bond0 这个命令是用于在Linux操作系统上配置IP路由的命令。具体来说,这个命令的含义是: ip route add: 这部分表示要添加…...

不同MySQL服务的表以及库的数据迁移(/备份)
目标: 将本地主机上usernameroot,passwordroot,port3307的MySQL服务中migration_one数据库的table_11数据表导出到本地的D:\start_java\XinQiUtilsOrDemo\testMigrationMySQL\table_11.bak注意:目前D:\start_java\XinQiUtilsOrDemo\testMigrationMySQL该…...

聊聊芯片超净间的颗粒(particle)
在芯片制造领域,颗粒的存在可能对生产过程产生巨大影响。其中,每个微小的颗粒,无论是来自人员、设备,还是自然环境,都有可能在制程中引发故障,从而对产品性能产生负面影响。这就是为什么在芯片厂中…...

服务器(windows Server 2019为例)中的日志中文乱码的解决办法
1. 首先,打开控制面板,找到区域(Region),把Format设置为国语简体中文,点击高级(Administrative)后设置Current system locale为国语简体中文,按照图中步骤:...

Linux 学习(CentOS 7)
CentOS 7 学习 Linux系统内核作者: Linux内核版本 内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。 Linux内核版本又分为稳定版和开发版,两种版本是相互关联&am…...

架构决策记录 ADR
在项目和产品开发过程中,软件工程团队需要做出架构决策以实现其目标。这些决策可以是技术性的,也可以与流程相关。 技术决策:例如决定使用JBOSS Data Grid作为缓存解决方案还是选择Amazon Elasticache,或者决定使用AWS Network L…...

SSM之spring注解式缓存redis->redis整合,redis的注解式开发及应用场景,redis的击穿穿透雪崩
redis整合redis的注解式开发及应用场景redis的击穿穿透雪崩 1.redis整合 mysql整合 pom配置; String-fmybatis.xml --> mybatis.cfg.xml: 包扫描; 注册了一个jdbc.properties(url/password/username/...); 配置数据源(数据库连…...

数据库性能优化(查询优化、索引优化、负载均衡、硬件升级等方面)
数据库性能优化是提升数据库系统整体性能和响应速度的一系列技术和策略。它可以通过多种方式来实现,包括优化查询语句、索引设计、硬件升级、负载均衡等手段。 合适的数据模型设计 正确的数据模型设计是性能优化的基石。合理的表结构和关系设计可以减少冗余数据&…...

谁说 Linux 不能玩游戏?
在上个世纪最早推出视频游戏的例子是托马斯戈德史密斯(Thomas T. Goldsmith Jr.)于1947年开发的“「Cathode Ray Tube Amusement Device」”,它已经显着发展,并且已成为人类生活中必不可少的一部分。 通过美国游戏行业的统计数据&…...

发电机负载测试方案
发电机负载测试是为了评估发电机在不同负载条件下的性能和稳定性。下面是一个可能的发电机负载测试方案: 测试前准备: - 确定测试的负载范围和条件,包括负载大小、负载类型(如电阻性、感性或容性负载)、负载持续时间等…...

Flask三种文件下载方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来实现文件下载。在本文中,我们将介绍三种不同的方法,以便你能够选择最适合你应用程序的方法。 方法一:使用 send_file 函数 send_file 函数是 Flask 中最常用的文件下载方法…...

OpenCV C++ 图像处理实战 ——《基于NCC多角度多目标匹配》
OpenCV C++ 图像处理实战 ——《基于NCC多角度多目标匹配》 一、结果演示二、NCC模板匹配2.1、OpenCV matchTemplate2.2、多角度2.3、多目标2.4、NMS非极大值抑制三、代码实现3.1 制作模板3.1 单目标匹配3.1.1 模板图像旋转3.1.2 旋转目标坐标3.2 多目标匹配3.2.1 制作模板3.2.…...

【书籍篇】Spring实战第4版 第2部分 Web中的Spring
Spring实战第4版 第2部分 Web中的Spring 五. 构建Spring Web应用程序5.1 SpirngMVC请求流程5.2 搭建Spring MVC5.2.1 配置DispatcherServlet5.2.2 配置WebConfig5.2.3 配置RootConfig 5.3 编写基本的控制器5.4 Spittr首页5.6 复杂的控制器5.6.1 定义类级别的请求处理5.6.2 传递…...

IC - 基础知识 - SOC与MCU
说明 工作中有涉及到SOC和MCU,非嵌入式专业,对两个概念理解不是很清晰。 共同点 MCU和SOC是两种常见的集成电路 (IC) 设计形式,它们的区别在于它们的设计目的和应用场景。工作中将MCU和SOC都称为IC也是没问题的,但是专业人员会…...

【elasticsearch+kibana基于windows docker安装】
创建网络:es和kibana容器互联 docker network create es-net加载镜像 docker pull elasticsearch:7.12.1运行 docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -v $…...

VMware网络设置 桥接模式 NAT VMNET0 1 8
1.桥接模式 虚拟机与主机并列 可拥有独立IP 主机与虚拟机之间,以及各虚拟机之间都可以互访。对应虚拟机就被当成主机所在以太网上的一个独立物理机来看待,各虚拟机通过默认的 VMnet0 网卡与主机以太网连接,虚拟机间的虚拟网络为 VMnet0。这…...

【MongoDB】MongoExport如何过滤数据导出
问题 使用MongoDB处理导出数据时,想增加数据过滤操作。 例如:导出所有isGirl为true的所有数据。 分析 在mongoexport说明文档中找到了query字段和queryFile字段,用来进行数据查询匹配导出。 query字段 后面直接跟 json格式数据。 queryF…...