sql优化常用

news2024/11/27 12:42:53

1、explain 输出执行计划

在select语句前加上explain就可以了(MySQL 5.6开始,不仅仅支持select )能够简单分析sql的执行情况,是否走索引等。

  • type列,连接类型。一个好的SQL语句至少要达到range级别。从最好到最差的连接类型为const、eq_reg、- ref、range、index和ALL。一般来说,得保证查询至少达到range级别(范围扫描),最好能达到ref(索引访问)。

  • key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。

  • key_len列,索引长度。

  • rows列,扫描行数。该值是个预估值。

  • extra列,详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。

更多相关关内容联合索引、索引失效、索引下推优化、回表、覆盖盖索引等问题可参看:MySQL慢查询是怎么回事、MySQL索引

2、in 和 not in 要慎用

SQL语句中IN包含的值不应过多,MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:

select id from t where num in(1,2,3)

对于连续的数值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

再或者使用连接来替换。

当IN的取值范围较大时会导致索引失效,走全表扫描。By the way:如果使用了 not in,则不走索引

3、少用select *

SELECT语句务必指明字段名称,select * 增加很多不必要的消耗(CPU、IO、内存、网络带宽);

4、善用limit 1

这是为了使explain中type列达到const类型。当只需要一条数据的时候,使用limit 1,如果加上limit1,查找到就不用继续往后找了。

5、 order by字段建索引

避免全表扫描,首先应考虑在 where 及 order by涉及的列上建立索引,如果排序字段没有用到索引,就尽量少排序
可以在程序中排序。

6、count(*)推荐使用

count()、count(主键 id) 和 count(1) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。
count(
) 是例外,并不会把全部字段取出来,而是专门做了优化,不取值。count(*) 肯定不是 null,按行累加。

按照效率排序的话,count(字段)<count(主键 id)<count(1)≈count(),推荐使用count()

7、where 子句中避免is null /is not null

应尽量避免在 where 子句中对字段进行 null 值判断,使用is null 或者is not null 理论上都会走索引,存在Null值会导致mysql优化器处理起来比较复杂,容易导致引擎放弃使用索引而进行全表扫描。

select id from t where num is null

所以设计表字段时尽量避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。

8、应尽量避免在 where!=或<>

子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

9、应尽量避免在 where 子句中使用 or

如果使用or那么要求or两边的条件字段都要有索引,才会走索引,如果其中一边有一个字段没索引, 另一个字段上的索引也会失效。很多时候使用union all或者是union(必要的时候)的方式来代替“or”会得到更好的效果。

应尽量避免在 where 子句中使用 or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

select id from t where num=10 or num=20

可以这样查

select id from t where num=10
union all
select id from t where num=20

10、尽量用union all代替union

union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。

11、应尽量避免在where子句中对字段进行函数操作

select id from t where substring(name,1,3)=‘abc’

不要在子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

12、可以选择 exists 代替 in

select num from a where num in(select num from b)

用下面的语句替换:

select num from a where exists(select 1 from b where num=a.num)

13、避免%xxx式查询

在非覆盖索引场景下,大家知道MySQL索引有最左原则,所以通过 like '%xx%'查询的时候一定会造成索引失效(5.7版本覆盖索引可以走索引),一般采用like 'xx%'右边匹配的方式来索引。

当想要获取的字段多了以后,select * from t_user where name like “%xx”; 要查询的数据就不能只在索引树里找了,得需要回表操作才能完成查询的工作,再加上是左模糊匹配,无法利用索引树的有序性来快速定位数据,所以得在索引树逐一遍历,获取主键值后,再到聚簇索引树检索到对应的数据行,这样实在太累了。
优化器认为上面这样的查询过程的成本实在太高了,所以直接选择全表扫描的方式来查询数据。

所以,使用左模糊匹配(like ‘%xx’)并不一定会走全表扫描,但也容易失效,关键还是看数据表中的字段。

14、选择重复值较低的字段建索引

在创建索引时,一定要选择重复值较低的字段。离散型非常的差,优化器可能直接就选择不走索引了,因为优化器可能认为,走索引和全表扫描差不多。值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段不适合做索引。

15、高效的分页

select id,name,age from user limit 10000, 20;

mysql会查询10020条,然后丢弃前面10000条,这个比较浪费资源
可以优化:

select id,name,age from user id>10000 limit 20;

找到上次分页最大id

16、join使用问题

用连接查询代替子查询、join表不易超过3个、小表驱动大表、链接字段建索引。

17、关于索引本身

使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引。

#sql优化#

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

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

相关文章

无线通信——Mesh体系结构

Mesh体系结构 了解Mesh的体系结构有利于我们后期的理解&#xff01;这里有些简单的知识点以及解释 WMN&#xff1a;WMN就是无线mesh网络&#xff0c;我们一般提到WMN其实特指就是Mesh网络的整个体系结构 STA&#xff1a;客户工作站&#xff0c;这个东西就是用户的设备端&…

OAuth2 refreshToken时只获取到用户名的问题解决

1. grant_type为refresh_token时, authentication.getPrincipal()只获取到了字符串类型的用户名(这种情况下生成的access_token是没有权限的,访问不了正常的有权限校验的接口) , 跟踪源码发现 是 DefaultUserAuthenticationConverter#extractAuthentication中的userDetailsSer…

精密空调别再这样管理了,太麻烦啦!

在现代生活中&#xff0c;空调系统已经成为不可或缺的一部分&#xff0c;特别是在高温季节。然而&#xff0c;空调系统的有效性和效率对于节能、环保和用户舒适性至关重要。为了更好地满足这些需求&#xff0c;精密空调监控系统应运而生。 精密空调监控系统结合了先进的技术&am…

新版pycharm(2023.2.2)修改字体大小

下载了2023新版pycharm&#xff0c;想修改字体&#xff0c;发现找不到之前的setting入口&#xff0c;网上搜索也都是file-setting-editor这些&#xff0c;自己找了找&#xff0c;记录下 2023版pycharm的修改字体大小在file-Manage IDE Settings-Setting Sync… 里面&#xff0…

java幼儿园校园学习资源互助共享平台的设计springboot+vue

幼儿资源共享之家在设计之初也只是想弄个关于幼儿资源的一些物资交换系统&#xff0c;但是仅仅是作为一个进行二手交易类型的网站&#xff0c;用户粘性会出现问题&#xff0c;进而会导致产品可能不会达到预期&#xff0c;甚至开发的小黄鸭幼儿资源共享之家会无法良性生存下去。…

二叉树的最小深度(rust实现)

二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 思路 这道题本质上是考察&#xff1a; 如何遍历二叉树理解什么是深度 对于这两点的考察&am…

再添殊荣!移远通信获评中国移动2023 年行业智能硬件库集团级金牌合作伙伴

10月12日下午&#xff0c; 2023中国移动全球合作伙伴大会政企论坛顺利举办。作为中国移动重要的合作伙伴&#xff0c;移远通信受邀参会&#xff0c;并凭借与中国移动在物联网领域长期、深入的合作&#xff0c;获评中国移动2023 年行业智能硬件库集团级金牌合作伙伴。移远通信副…

windows查看每个程序建立的TCP链接数量

首先以管理管权限打开powershell Set-ExecutionPolicy RemoteSigned然后运行脚本 脚本在文档最上方 就可以看到

windows系统使用软件异地同步数据(灾备)

Syncthing是一个开源文件同步工具&#xff0c;可以在多台设备之间实时同步文件或文件夹&#xff0c;官方网站&#xff1a;Syncthing 下载地址&#xff1a;Syncthing | Downloads &#xff0c;一般推荐下载图形界面SyncTrayzor。 官方下载地址&#xff1a; https://github.c…

找到合适的软件外包开发团队

寻找适合的软件外包开发团队需要经过一系列步骤和考虑因素。以下是一些寻找外包开发团队的关键步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 明确需求和目标&#xff1a; 在寻找外包团队之前&a…

判断非线性负载是否合格的方法可以从以下几个方面进行考虑:

额定功率容量&#xff1a;需要了解负载设备的额定功率容量&#xff0c;根据负载设备的规格和说明书&#xff0c;确定其额定功率容量是否能够满足实际需求&#xff0c;如果超过了负载设备的额定功率容量&#xff0c;可能会导致设备过载&#xff0c;从而影响其正常运行。 电压波形…

win10录音机入门指南,让你的录音更轻松

“win10怎么录音呀&#xff1f;朋友说win10有自带的录音机&#xff0c;但是我在电脑上找了很久都没找到&#xff0c;大家知道win录音机怎么打开吗&#xff1f;教教我吧。” 在数字化时代&#xff0c;录音机已经成为人们日常生活和工作中不可或缺的一部分。无论是记录会议、讲座…

万界星空科技/生产制造执行MES系统/开源MES/免费MES

开源系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、免费MES、免费智能制造系统、免费排产系统、免费排班系统、免费质检系统、免费生产计划系统、免费数字化大屏。 万界星空开源MES制造执行系统的Java开源版本。开源mes…

pip更新报错 Command “python setup.py egg_info“ failed with error code 1

已解决&#xff0c;解决方法直接跳转到文章末尾 这个问题遇到过好几次了&#xff0c;尝试多种办法但都没解决&#xff0c;之前一次是在部署openstack时遇到&#xff0c;当时也是没解决。 使用linux自带到python2.7&#xff0c;pip版本只有6.x&#xff0c;需要升级pip&#xf…

【五天教学】遥感数据与作物模型同化实践技术应用

基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具&#xff0c;可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系&#xff0c;为不同条件下作物生长发育及产量预测、栽培管理、环境评价以及未来气候变化评估等提供了…

Matlab进阶绘图第31期—桑基图(Sankey Chart)

桑基图&#xff08;Sankey Chart&#xff09;本质为一种流程图&#xff0c;可以很好地展示数据的层次结构以及流量变化。 桑基图主要由节点块与流动路径线组成。 其中&#xff0c;节点块用于表示类别&#xff1b;流动路径线除了可以直观地表示流动的方向&#xff0c;其宽度还…

arcgis server打印影像问题

切片服务不勾这个就可以正常打印&#xff0c;勾了就是打印动态的

信钰证券:今日投资前瞻:飞行汽车行业迎来新突破 银行板块配置渐进

上星期五&#xff0c;两市股指低开低走&#xff0c;深成指、创业板指、上证50指数盘中均跌超1%。到收盘&#xff0c;沪指跌0.64%报3088.1点&#xff0c;深成指跌0.99%报10068.28点&#xff0c;创业板指跌1.11%报1996.6点&#xff0c;两市算计成交8084亿元&#xff0c;北向资金大…

BIDS数据存储格式介绍与dcm2bids安装与使用

介绍dcmtk和dcm2bids BIDS&#xff08;Brain Imaging Data Structure&#xff09;是一种用于规范化神经影像数据的标准&#xff0c;它定义了数据的目录结构、文件命名规则和元数据格式。BIDS使得数据的共享和分析更加容易&#xff0c;同时很多主流的图像处理自动化软件也需要B…

【剑指Offer】28.对称的二叉树

题目 给定一棵二叉树&#xff0c;判断其是否是自身的镜像&#xff08;即&#xff1a;是否对称&#xff09; 例如&#xff1a;下面这棵二叉树是对称的 下面这棵二叉树不对称。 数据范围&#xff1a;节点数满足 0≤n≤1000&#xff0c;节点上的值满足 0∣val∣≤1000 要求&am…