【MySQL索引】4索引优化

news2024/12/23 0:52:43

索引优化

1 关联查询优化

左连接LEFT JOIN

LEFT JOIN 右边是我们的关键点,一定需要建立索引 .这里是book的card 字段,type建不建索引无所谓。

ALTER TABLE book ADD INDEX Y ( card); #【被驱动表】,可以避免全表扫描
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book ON type.card = book.card;

内连接INNER JOIN

换成 inner join(MySQL自动选择驱动表 ,一般选取小表为驱动表)
被驱动表加上索引即可。

小结

保证被驱动表的JOIN字段已经创建了索引

需要JOIN 的字段,数据类型保持绝对一致。

LEFT JOIN 时,选择小表作为驱动表, 大表作为被驱动表 。减少外层循环的次数。

INNER JOIN 时,MySQL会自动将 小结果集的表选为驱动表 。选择相信MySQL优化策略。

能够直接多表关联的尽量直接关联,不用子查询。(减少查询的趟数)

不建议使用子查询,建议将子查询SQL拆开结合程序多次查询,或使用 JOIN 来代替子查询。

衍生表建不了索引

2 子查询优化

在这里插入图片描述

3 排序优化

order by 优化FileSort ,但使用FileSort不一定慢
在这里插入图片描述

INDEX a_b_c(a,b,c)
order by 能使用索引最左前缀
- ORDER BY a
- ORDER BY a,b
- ORDER BY a,b,c
- ORDER BY a DESC,b DESC,c DESC
如果WHERE使用索引的最左前缀定义为常量,则order by 能使用索引
- WHERE a = const ORDER BY b,c
- WHERE a = const AND b = const ORDER BY c
- WHERE a = const ORDER BY b,c
- WHERE a = const AND b > const ORDER BY b,c
不能使用索引进行排序
- ORDER BY a ASC,b DESC,c DESC /* 排序不一致 */
- WHERE g = const ORDER BY b,c /*丢失a索引*/
- WHERE a = const ORDER BY c /*丢失b索引*/
- WHERE a = const ORDER BY a,d /*d不是索引的一部分*/
- WHERE a in (...) ORDER BY b,c /*对于排序来说,多个相等条件也是范围查询*/

例子:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 GROUP BY优化

在这里插入图片描述

5 优化分页查询

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

EXPLAIN SELECT * FROM student t,(SELECT id FROM student ORDER BY id LIMIT 2000000,10)
a
WHERE t.id = a.id;

2 该方案适用于主键自增的表,可以把Limit 查询转换成某个位置的查询 。

EXPLAIN SELECT * FROM student WHERE id > 2000000 LIMIT 10;

6 优先考虑覆盖索引

在这里插入图片描述

7 对字符串添加前缀索引的考虑

使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。前面已经讲过区分度,区分度越高越好。因为区分度越高,意味着重复的键值越少。

使用前缀索引就用不上覆盖索引对查询性能的优化了,这也是你在选择是否使用前缀索引时需要考虑的一个因素。

8 索引下推

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

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

在这里插入图片描述

9 普通索引 vs 唯一索引

  1. 普通索引和唯一索引应该怎么选择?其实,这两类索引在查询能力上是没差别的,主要考虑的是对 更新性能 的影响。所以,建议你 尽量选择普通索引 。
  2. 在实际使用中会发现, 普通索引 和 change buffer 的配合使用,对于 数据量大 的表的更新优化还是很明显的。
  3. 如果所有的更新后面,都马上 伴随着对这个记录的查询 ,那么你应该 关闭change buffer 。而在其他情况下,change buffer都能提升更新性能。
  4. 由于唯一索引用不上change buffer的优化机制,因此如果 业务可以接受 ,从性能角度出发建议优先考虑非唯一索引。但是如果"业务可能无法确保"的情况下,怎么处理呢?

首先, 业务正确性优先 。我们的前提是“业务代码已经保证不会写入重复数据”的情况下,讨论性能问题。如果业务不能保证,或者业务就是要求数据库来做约束,那么没得选,必须创建唯一索引。这种情况下,本节的意义在于,如果碰上了大量插入数据慢、内存命中率低的时候,给你多提供一个排查思路。
然后,在一些“ 归档库 ”的场景,你是可以考虑使用唯一索引的。比如,线上数据只需要保留半年,然后历史数据保存在归档库。这时候,归档数据已经是确保没有唯一键冲突了。要提高归档效率,可以考虑把表里面的唯一索引改成普通索引。

10 其他

EXISTS IN

不太理解哪种情况下应该使用 EXISTS,哪种情况应该用 IN

  • 使用 EXISTS 的场景:

测试是否存在:当你只关心某个条件是否在子查询中存在时,EXISTS 是一个更自然的选择。
子查询结果集较大:当子查询返回的数据集较大时,EXISTS 可以避免不必要的全表扫描,因为一旦找到符合条件的行,就会终止子查询。

  • 使用 IN 的场景:

具体匹配值:当你需要检查某个具体的值是否存在于子查询的结果集中时,IN 是更适合的选择。
子查询结果集较小:如果子查询返回的结果集较小,使用 IN 可以是一个简单而有效的方法。

COUNT(*) COUNT(具体字段)

SELECT COUNT(*) 、 SELECT COUNT(1) 和
SELECT COUNT(具体字段) ,使用这三者之间的查询效率是怎样的?

性能总结
COUNT(*):最常用且效率最高的方法,大多数现代数据库系统对此做了专门的优化。

COUNT(1):在性能上与 COUNT(*) 基本相同,大多数数据库系统会将它们处理得一样快。

COUNT(具体字段):可能会更慢,特别是在字段上没有索引时。它只计算非 NULL 的字段值,因此可能需要扫描整个表来完成计数。

选择指南
如果需要计算表中的所有记录数,不考虑 NULL 值,请使用 COUNT(*)。

如果需要计算某个字段的非 NULL 值的数量,请使用 COUNT(具体字段)。

对于性能要求较高的查询,优先考虑 COUNT(*) 或 COUNT(1),因为它们在绝大多数情况下效率相当,并且有数据库系统的优化支持。

SELECT(*)

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

LIMIT 1 对优化的影响

针对的是会扫描全表的 SQL 语句,如果你可以确定结果集只有一条,那么加上 LIMIT 1 的时候,当找到一条结果的时候就不会继续扫描了,这样会加快查询速度。
如果数据表已经对字段建立了唯一索引,那么可以通过索引进行查询,不会全表扫描的话,就不需要加上 LIMIT 1 了。

多使用COMMIT

只要有可能,在程序中尽量多使用 COMMIT,这样程序的性能得到提高,需求也会因为 COMMIT 所释放的资源而减少。

COMMIT 所释放的资源:
回滚段上用于恢复数据的信息
被程序语句获得的锁
redo / undo log buffer 中的空间
管理上述 3 种资源中的内部花费

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

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

相关文章

2.5G网络(通常指2.5G以太网,即2500BASE-X)的网络变压器在设计和应用上有几个关键方面

信号传输和接收&#xff1a; 2.5G网络变压器主要用于以太网设备中&#xff0c;用于将信号从平衡转换为非平衡&#xff0c;或者进行阻抗匹配&#xff0c;确保信号能够在传输线和接收器之间有效地传输和接收。 频率范围&#xff1a; 这些变压器需要支持2.5G以太网的频率范围&…

Java 入门指南:Java 并发编程 —— 两万字详解 进程(Process)与线程(Thread)

线程和进程是操作系统中两个重要的概念&#xff0c;用于实现并发执行和多任务处理。 基础概念 进程 进程&#xff08;Process&#xff09;&#xff1a;进程是计算机中正在运行的程序的实例。它是操作系统分配系统资源的基本单位&#xff0c;包括程序代码、数据、打开的文件、…

Global Illumination_LPV Deep Optimizations

接上回&#xff0c;RSM优化技术介绍后&#xff0c;我们本部分主要看一下&#xff0c;光栅GI三部曲中的LPV&#xff0c;这个算法算是很巧妙了&#xff0c;算法思路基于RSM上拓展到世界空间&#xff0c;可以说很具学习和思考价值&#xff0c;之前也简单实现过Global Illumination…

【 html+css 绚丽Loading 】000028 九宫幻明轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

AI智能导诊小程序源码,在智能导诊系统中,自然语言处理技术的运用

概述 智能导诊基于医疗 AI 、自然语言处理技术&#xff0c;推出的在线导医分诊智能工具&#xff0c;覆盖导诊、智能问答、科普宣教等就医服务&#xff1b;智能导诊通过人体图、症状列表等形式进行疾病自测&#xff0c;快速推荐就诊科室、医生推荐。产品可应用于微信线上挂号、…

SQLi-LABS通关攻略【51-55关】

SQLi-LABS 51关 51关和50关一样&#xff0c;只是改为了单引号闭合 依旧有报错信息&#xff0c;可以使用报错注入 构造payload,得到数据库名 ?sort1 and updatexml(1,concat(1,database()),1)-- SQLi-LABS 52关 52关和50关一样&#xff0c;但是没有报错信息&#xff0c;所以报…

智慧监管:地理信息与遥感技术驱动下的社会治理新纪元

在信息化浪潮席卷全球的今天&#xff0c;智慧监管已成为推动社会治理现代化的关键力量。本文将深入剖析智慧监管的概念、技术基础、应用场景及其对社会发展的深远影响&#xff0c;探讨如何在新时代背景下&#xff0c;利用地理信息与遥感技术构建更加智慧、高效的监管体系。 智…

仿华为车机UI--图标从Workspace拖动到Hotseat同时保留图标在原来位置

基于Android13 Launcher3,原生系统如果把图标从Workspace拖动到Hotseat里则Workspace就没有了&#xff0c;需求是执行拖拽动作后&#xff0c;图标同时保留在原位置。 实现效果如下&#xff1a; 实现思路&#xff1a; 1.如果在workspace中拖动&#xff0c;则保留原来“改变图标…

【u盘还原教程】如何把启动u盘恢复回普通U盘

之前制作ubuntu启动盘装双系统 1、插入U盘&#xff0c;右键点击“此电脑”&#xff0c;选择“管理”&#xff0c;在“计算机管理”的面板中点击打开“磁盘管理”&#xff0c;会看到目前电脑上的所有磁盘&#xff0c;找到U盘的索引名&#xff08;如图标识&#xff0c;这里是“…

2024最新VMware17安装Windows10详细记录

本次将带来虚拟机VMware Workstation 17 pro安装Win10的教学&#xff0c;可用于各种软件测试&#xff0c;这里虽然只是示范了win10安装教学&#xff0c;实际上可以安装很多系统&#xff0c;步骤都差不多&#xff1b; 下载 一、下载虚拟机软件 下载方式一&#xff1a;官网下载…

虚拟机安装docker时yum错误及及解决方案

** Could not resolve host: mirrorlist.centos.org; 未知的错误 ** 出现这种错误&#xff0c;先尝试 ping www.baidu.com&#xff0c;然后再尝试 ping mirrorlist.centos.org 如果&#xff0c;baidu.com可以ping通&#xff0c;mirrorlist.centos.org 不能ping通&#xff0…

【三十四】springboot+easyRule初识规则引擎

代码场景&#xff1a;厂里有几个员工&#xff0c;现在厂长颁布了新的厂规关于薪资发放&#xff0c;如下&#xff1a; 1、加班时长超过80小时的&#xff0c;一个小时10块钱&#xff1b;不满80小时的&#xff0c;不算加班。2、上班打卡迟到3次以下的不扣钱&#xff0c;3次以上的一…

期权交易误区分享:喜欢重仓!

今天带你了解期权交易误区分享&#xff1a;喜欢重仓&#xff01;期权交易虽然吸引人&#xff0c;但也有不少容易掉进去的坑。 有的投资者被单个期权的百倍利润吸引&#xff0c;喜欢“一口吃成胖子”。 重仓买入虚值和重度虚值的期权&#xff0c;当标的有大涨或大跌时&#xf…

零基础Opencv学习(一)

一、显示图片 #include "opencv2/opencv.hpp" #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp"cv::Mat image cv::imread("E:/OpencvStudyTest/1.png"…

量化投资策略与技术学习PART1.1:量化选股之再谈多因子模型(二)

在上一个多因子模型中&#xff0c;我手动对各个因子进行了回测&#xff0c;但是数据结果并不是十分理想&#xff0c;难道基本面指标真的和股票走势关系不大么&#xff1f; 这里我还是准备再测试一下&#xff0c;策略如下&#xff1a; &#xff08;1&#xff09;首先我获取了一下…

Doped code 介绍

doped是一款Python软件&#xff0c;用于缺陷超单元计算的生成、前/后处理和分析&#xff0c;以高效、可重复、用户友好、功能强大且完全可定制的方式实施缺陷模拟工作流程。 https://doped.readthedocs.io/en/latest/ 教程页面提供了演示代码功能和用法&#xff0c; 该软件包的…

考试评分系统设计与实现/基于django的在线考试系统

摘要 随着互联网技术的不断发展&#xff0c;各行各业的工作学习的模式都发生了不小的变化&#xff0c;们通过互联网技术不仅能够提高工作效率还能够降低出错的几率。而对于考试评分&#xff0c;一个专业的系统可以帮助管理者更加有效管理在考试评分&#xff0c;可以帮助提高克服…

vaspup2.0介绍

实时软件库:https://github.com/kavanase/vaspup2.0 vaspup是一个bash脚本集合&#xff0c;可以有效地生成和分析VASP收敛测试计算。 最初的vaspup是由Alex Ganose开发&#xff0c;用于基态能量收敛测试和POTCAR生成。 vaspup2.0的功能包括: 基态能量相对于ENCUT和k点密度的收敛…

Linux 配置wireshark 分析thread 使用nRF-Sniffer dongle

Linux 配置wireshark nRF-Sniffer-for-802.15.4 1.下载固件和配置文件 https://github.com/NordicSemiconductor/nRF-Sniffer-for-802.15.4 2.烧写固件 使用nRF Connect for Desktop 中的 programmer 4.3烧写 https://www.nordicsemi.com/Products/Development-tools/nrf-conne…

python07-单元测试框架unittest1-1

前言 单元测试是软件开发中不可或缺的一部分&#xff0c;可以帮助开发人员确保代码的正确性、可靠性和稳定性&#xff0c;python是一种广泛使用的程序语言&#xff0c;提供了多种单元测试工具&#xff0c;最常用的是unittest。本文将介绍unittest package, 包括如何编写测试Tes…