教你如何优化MySQL慢查询SQL语句?快速提升系统性能!

前言

应用系统性能测试过程中,性能优化是绕不开的话题,对测试人员而言,性能优化的第一站就是SQL语句的优化与分析。因此本文主要以MySQL数据库为例,介绍常见的慢查询SQL语句执行效率分析与优化方法和简单示例,为致力于应用系统性能优化的从业人员提供一定参考和借鉴。

1、慢查询定位

1)慢查询 慢查询SQL语句,即在数据库执行耗时超过一定阈值的SQL语句,常见阈值为500~2000ms,可根据业务需求适当调整。如存在大量慢查询语句会直接导致系统响应时间变长,降低用户体验感,因此慢查询的定位与优化是SQL语句优化的主要内容。 慢查询调优的第一步是准确定位慢查询语句,需要数据库开启慢查询日志记录功能,然后借助工具对日志进行分析实现慢查询SQL语句的准确定位。 --慢查询开启状态、日志位置 show variables like`slow_query%`; --慢查询命中时长 show variables like`long_query_time`;

2)mysqldumpslow慢查询日志分析

MySql数据库的慢查询SQL语句,可以借助mysqldumpslow工具进行分析;其他类型数据库,可根据官方提供的技术文档采用对应的工具开展慢查询日志分析。

慢查询日志分析的常用参数说明如下:

例:用时最多的10条慢SQL(后半部分为slow_query_log_file地址)

sql mysqldumpslow-s t-t 10-g'select'/data/mysql/data/dcbi-3306/log/slow.log

2 SQL语句执行分析

1)SQL执行顺序 分析SQL语句执行效率的第一步,需要了解一条SQL语句的执行顺序,从而为语句优化提供依据。一般而言,执行顺序为: from->where->group by->聚合函数(sum、avg)->having->计算公式->select字段->order by->limit

2)explain关键字 SQL语句执行分析可通过在SQL语句前添加“explain”关键字后,在数据库编辑器中执行查看语句具体的执行情况。 explain select*from table_name where columns_1=value_1 and columns_2=vales_2

3)SQL执行计划返回结果说明 返回结果各列说明可按需查询相关资料,重点关注【type】、【ref】、【extra】反映查询效率的3列,以【type】为主即可。

4)SQL执行效率分析 explain语句根据【type】列的值判断SQL执行效率,效率从低到高依次为: all<index<range<index_merge<ref<eq_ref<const<system。一般而言,【type】列值至少要在(range,system)之间,执行效率才能达到较高水平。

5)SQL语句执行效率对比

在开展SQL优化的过程中,对比两条SQL语句执行时间验证优化效果时,需要明确语句执行过程中数据的存取方式。根据数据库数据查询机制,若数据库内存中已存在目标数据,则直接从内存中获取数据,不再是从数据库物理磁盘获取数据。这种情况下,当优化前SQL语句执行后,目标数据已暂存于数据库内存中时;执行优化后SQL语句时,则直接从数据库内存中获取数据,导致该语句执行时间失真。

为避免验证优化效果时,出现上述SQL语句执行时间失真的情况,需在select关键字后添加SQL_NO_CACHE关键字声明,通过数据库引擎重新查询数据。SQL_NO_CACHE指的是查询结果在内存展示后,直接从内存中释放,并非不从内存中读取数据。因此,若在执行SQL_NO_CACHE之前已经查询过目标数据,导致目标数据已经在数据库内存中,则该语句失效。

用法示例如下:

select SQL_NO_CACHE columns from table_name where column_1=vales_1 and columns_2=values_2;

需要说明的是,SQL_CACHE、SQL_NO_CACHE命令在MySQL 5.7.20开始废弃,MySQL 8.0后彻底移除,普通select命令即直接从数据库中获取数据,无需从数据库内存中获取数据。其他类型数据库相关机制,按需查阅对应官方技术文档。

3.常见SQL优化方法

1)索引覆盖 SQL优化最常见的方法,就是实现索引覆盖,即select后的查询列、where后的查询条件均包含索引,通过查询条件即可获得查询列数据。 常见索引覆盖场景: 1)使用主键索引,select后的查询列不包含主键,则无法实现索引覆盖; 2)使用非主键索引,select后的查询列包含非主键索引,可实现索引覆盖; 3)使用非主键索引,select后的查询列包含主键索引,可实现索引覆盖。

2)最左匹配原则 MySQL建立联合索引(多列索引)时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。具体是因为,索引最左列全局有序、其余列局部有序但全局无序,因此根据索引查询必须满足最左匹配原则,否则索引失效。 基于最左匹配原则,在创建索引时,根据业务需求,where中使用最频繁的列放在最左边; 最左匹配原则,遇到范围查询(>、<、between)时会停止匹配,即范围查询后的索引失效; 示例1:某张表索引按序为(a,b,c),如筛选条件为where a=1 and b=2,索引a、b均被使用到;如筛选条件为where b=2,则因未使用a=1,不满足最左匹配,索引失效;where a=1 and b>1 and c=3,因b为范围查询,b、c均索引失效。 示例2:某张表索引按序为(a,b,c),其中b字段在表table的所有值均为常量02003,同一个查询有4种不同的SQL语句写法: --SQL语句1 select*from table where c='62412001090472816354' --SQL语句2 select*from table where b='02003'and c='62412001090472816354' --SQL语句3 select*from table where a='344589'and b='02003'and c='62412001090472816354' --SQL语句4 select*from table where a='344589'and c='62412001090472816354' 上述SQL语句执行3次平均耗时分别为:

结论:SQL语句1、SQL语句2因不满足最左匹配原则,导致索引失效,查询耗时较长;SQL语句3、SQL语句4使用到索引,查询速度较快;但SQL语句4因缺失索引字段b,相对SQL语句3耗时较长,可见索引字段b即便在整张表中均为常量,列入where后的筛选条件,依然能提高查询效率。

3)索引条件下推

目的:检索数据时采用组合索引,且第一索引非等值索引时,尽量利用其他索引条件精准选择目标数据,减少数据多次回表判断是否符合目标数据的次数,以解决慢查询导致的性能问题。

方法:服务层(Server层)把查询工作下推到数据库引擎(InnoDB)去处理。

优势:减少回表查询次数,提高查询效率,降低数据库IO资源消耗。

判断:explain SQL输出【extra】列结果为using index condition。

下面详细对比使用下推和未使用下推时的数据库底层逻辑,进一步说明索引条件下推的优势。

使用下推 第一索引非等值索引的SQL语句使用索引条件时,应用层将查询请求发送至引擎层,引擎层根据索引条件,剔除不满足其他索引的数据,将剩余满足其他索引条件的数据返回应用层,尽量少回表地检索到对应记录。 使用条件下推时,引擎层可直接剔除不满足非第一索引中各列的数据。

未使用下推

SQL语句存在多个索引时,数据库Server层将查询请求发送至引擎层处理,引擎层按索引顺序,返回符合请求的数据到应用层。

数据库Server层完成筛选后,再按序发送下一索引检索条件,多次重复,直到满足所有查询条件。

如此多次循环,导致数据库IO资源消耗较高。

(4)小表驱动大表

根据表的结果集大小选择驱动表,一般使用小表作为驱动表

例如,某系统存在表table_a、表table_b,数据量分别为100万、10万,则查询两表关联数据时,将表table_b作为子表:

select*from table_a where column_1=''and column_2 in(select column_2 from table_b where...)

若必须使用大表table_a作为子表,则使用exists关键字。

select*from table_a where exists(select column_2 from table_b where...)

(5)in代替or

若where后查询条件中某字段存在多个值,则用in代替or。

select*from ar_ar_41 where ID_SHARD='10800000'and(NUM_SEQ_AR='11090141150000002'or NUM_SEQ_AR='11090141450000005');

select*from ar_ar_41 where ID_SHARD='10800000'and NUM_SEQ_AR in('11090141150000002','11090141450000005');

(6)分组避免排序

MySQL默认对所有group by字段进行排序,非必要情况下,分组避免排序。

SELECT goods_id,count(*)FROM t GROUP BY goods_id ORDER BY NULL;

(7)批量INSERT插入

插入多条数据时,尽量避免逐条数据插入,优先选择批量数据插入(插入数据量在50条及以上)。

--批量数据插入

INSERT INTO t(id,name)VALUES(1,’Bea’),(2,’Belle’),(3,’Bernice’);

--逐条数据插入

INSERT INTO t(id,name)VALUES(1,’Bea’);

INSERT INTO t(id,name)VALUES(2,’Belle’);

INSERT INTO t(id,name)VALUES(3,’Bernice’);

4、典型的索引失效案例

表city的联合索引为(ID,CountryCode),非索引列(Name,District,Population)

1)where索引列表达式计算 索引失效 select*from world.city where ID+1=4000; 索引未失效 select*from world.city where ID=4001;

2)where索引列使用函数 索引失效 select*from world.city where substring(CountryCode,1,2)='nl'; 索引未失效 select*from world.city where CountryCode like'nl%';select*from world.city where CountryCode like'nl_';

3)or条件包含非索引列 索引失效 select*from world.city where ID=4001 or Name='Simi Valley'; 索引未失效 select*from world.city where ID=4001 or CountryCode='USA';

4)like模糊查询,%在字首 索引失效 select*from world.city where CountryCode like'%nld%'; 索引未失效 select*from world.city where CountryCode like'nld%';

5)不满足最左匹配原则 索引失效 select*from world.city where CountryCode='USA'and Population=111351; 索引未失效 select*from world.city where ID=4001 and CountryCode='USA'and Population=111351; 备注:最左匹配导致的索引失效情况较多,详见最左匹配部分。

6)索引列未设置为NOT NULL

MySQL执行查询时会判断字段是否为NOT NULL,该过程往往需要全表扫描,因此最好为索引添加NOT NULL约束,并设置默认值,利于索引使用、加速查询效率

5关注:insert ignore into导致的性能问题或锁表

insert ignore into会对插入的每一行数据取共享锁(S锁,其他事务只可读)做唯一键的检测,同时会对主键自增ID加意向锁(insert intension);

在主键较为复杂的情况下,检测主键是否唯一时会一直占用主键的插入意向锁,其他进程也想给主键ID添加插入意向锁的时候,产生冲突导致死锁;

此外,代码中存在的insert replace into也需重点关注。

总结

SQL语句优化分析,是从事性能测试分析从业人员开展性能优化中的第一站,也是性能优化的基本技能,对系统性能提升具有重要作用和意义。在掌握性能优化基本技能的基础上,还需结合业务需求、代码逻辑访问路径,准确评估不同优化方法的适用性,综合对比不同优化方法工作成本,采用合理高效的优化方法开展性能优化工作。

文末了:

可以到我的个人号:atstudy-js,可以免费领取一份10G软件测试工程师面试宝典文档资料。同时我邀请你进入我们的软件测试学习交流平台,大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,了解测试行业的最新趋势,助你快速进阶Python自动化测试/测试开发,稳住当前职位同时走向高薪之路。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【原创】V2024中化解电力行业设备表的五年难题

我这个人今生注定不能“大富大贵”&#xff0c;因为我的缺点实在太多了&#xff0c;其中非常重要的一项是&#xff1a;脸盲&#xff01;简单来说就是很容易把不同的人搞混&#xff0c;记住名字的时候没记住面相&#xff0c;记住面相的时候又把名字给忘了&#xff0c;尴尬的人生…

Pod详细介绍

目录 Pod 1、Pod基础概念 2、集群中Pod的使用方式 1&#xff09;一个Pod中运行一个容器 2&#xff09;一个Pod中运行多个容器 3、Pod的类型 1&#xff09;控制器管理的Pod 2&#xff09;自助式Pod 3&#xff09;静态Pod 4、Pod中容器的分类 1&#xff09;基础容器&#xf…

day26_css

今日内容 零、 复习昨日 一、CSS 零、 复习昨日 HTML - 页面基本骨架结构,内容展现 CSS - 美化页面,布局 JS - 动起来 一 、引言 1.1CSS概念 ​ 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;…

首周聚焦百度智能云千帆大模型平台使用,《大模型应用实践》实训营11月16日开讲!

百度智能云千帆大模型平台官方出品的《大模型应用实践》实训营本周正式上线&#xff01;这是百度智能云推出的首个系列课程&#xff0c;课程内容满满干货&#xff01; 11月16日本周四即将开课&#xff0c;首周由百度智能云千帆大模型平台产品经理以及百度智能云千帆资深用户知…

什么是自动化测试框架?常用的自动化测试框架有哪些?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

【echarts】实现单线与多线滚轮联动、隐藏拖拽、关闭动画

单线滚轮联动 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>ECharts DataZoom</title><script src"https://cdn.jsdelivr.net/npm/echarts5.2.0/dist/echarts.min.js"></script> </hea…

为什么软件可以被破解,但是压缩包却破解不了?

为什么软件可以被破解&#xff0c;但是压缩包却破解不了&#xff1f; 软件的加密和压缩包的加密不是同一种加密。 压缩包的加密是传统意义上数据的加密&#xff0c;就是用一个密钥&#xff08;密码&#xff09;&#xff0c;对原始数据进行一些数学运算&#xff0c;得到一个密文…

数据结构与算法之美学习笔记:19 | 散列表(中):如何打造一个工业级水平的散列表?

目录 前言如何设计散列函数&#xff1f;装载因子过大了怎么办&#xff1f;如何避免低效的扩容&#xff1f;如何选择冲突解决方法&#xff1f;工业级散列表举例分析解答开篇内容小结 前言 本节课程思维导图&#xff1a; 今天&#xff0c;我们就来学习一下&#xff0c;如何设计一…

计算机视觉:使用opencv实现车牌识别

1 引言 汽车车牌识别&#xff08;License Plate Recognition&#xff09;是一个日常生活中的普遍应用&#xff0c;特别是在智能交通系统中&#xff0c;汽车牌照识别发挥了巨大的作用。汽车牌照的自动识别技术是把处理图像的方法与计算机的软件技术相连接在一起&#xff0c;以准…

芯向未来|紫光展锐CEO任奇伟博士受邀主持ICCAD 2023高峰论坛

11月10日至11日&#xff0c;中国集成电路设计业2023年会暨广州集成电路产业创新发展高峰论坛&#xff08;ICCAD 2023&#xff09;在广州保利世贸博览馆召开&#xff0c;本届年会以“湾区有你&#xff0c;芯向未来”为主题&#xff0c;分开幕式、高峰论坛、7场专题研讨、产业展览…

全局代码规范配置 ( Eslint )

项目团队开发 为了保证统一的代码格式规范&#xff0c;可以借助两个插件以及 eslint 自由配置进行 首先需要在 vscode 安装 Eslint Prettier - Code formatter 安装所需依赖 pnpm install --save-dev eslint eslint-plugin-react eslint-plugin-react-hooks eslint…

球星马布里申请香港高才通计划落户香港拿身份!谈谈香港身份的好处!

球星马布里申请香港高才通计划落户香港拿身份&#xff01;谈谈香港身份的好处&#xff01; 据香港政府新闻网14日消息&#xff0c;前美国职业篮球联赛球员马布里&#xff0c;日前向香港人才服务办公室递交高端人才通行证计划的申请。香港劳工及福利局局长孙玉菡与他会面&#x…

黄金投资面对K线图有哪些好用的交易策略?

在现货黄金交易中&#xff0c;学会观察K线图能够帮助投资者进行市场分析&#xff0c;根据K线图呈现出来的市场走势制定交易策略&#xff0c;是技术分析的主要作用。在黄金买卖过程中掌握K线交易技巧能够提升理财效率&#xff0c;所以这也就成为了炒金者的必修课。 K线图是以交…

使用手机作为电脑的麦克风和摄像头外设

工具 Iriun Iriun 电脑端安装&#xff1a;Iriun Android: Iriun 4K Webcam for PC and Mac - Apps on Google Play Apple: Iriun Webcam for PC and Mac on the App Store 基础功能免费&#xff0c;普通使用足够了。 付费功能&#xff1a; 使用 这里有介绍&#xff1a…

中国人民大学与加拿大女王大学金融硕士——人生下半场,用实力为自己“撑腰”

人生如同一场漫长的旅程&#xff0c;每个人都在不断地前行&#xff0c;经历着种种的人生阶段。当我们迈入人生的下半场&#xff0c;我们不再是无知少年&#xff0c;而是逐渐成为社会的中坚力量。在这个阶段&#xff0c;我们不仅要面对更多的挑战和压力&#xff0c;还需要用实力…

VulnHub DC-6

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

【多线程面试题二十五】、说说你对AQS的理解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说说你对AQS的理解 参…

Facebook游戏出海营销指南

当谈到Facebook游戏出海营销时&#xff0c;有一些关键的策略和指南可以帮助你在国际市场上取得成功。下面是一个详细的指南&#xff0c;帮助你了解如何有效地推广和推出你的游戏。 1、了解目标市场 在开始出海营销之前&#xff0c;你需要对你的目标市场进行深入的研究。了解该…

11月15日星期三今日早报简报微语报早读

1、2023胡润女企业家榜出炉&#xff1a;郭得胜夫人邝肖卿首次成为中国女首富&#xff0c;龙湖吴亚军蝉联中国白手起家女首富&#xff1b; 2、叶剑英元帅夫人吴博逝世&#xff0c;享年106岁&#xff1b; 3、外交部&#xff1a;所谓“联合国军”是冷战产物&#xff0c;于法无据…

前端跨界面之间的通信解决方案

主要是这两个方案&#xff0c;其他的&#xff0c;还有 SharedWorker 、IndexedDB、WebSocket、Service Worker 如果是&#xff0c;父子嵌套 iframe 还可以使用 window.parent.postMessage(“需要传递的参数”, ‘*’) 1、localStorage 核心点 同源&#xff0c;不能跨域(协议、端…