MySQL中如何查询及优化慢SQL语句
创作时间:
作者:
@小白创作中心
MySQL中如何查询及优化慢SQL语句
引用
CSDN
1.
https://blog.csdn.net/2201_75656709/article/details/145793220
在优化SQL语句前,需要查看哪条SQL语句执行时间较长,性能较差,可以通过以下方式查看。
一、查询及分析SQL语句
1. 开启profiling功能
在MySQL中,profiling功能可以帮助你分析SQL查询的性能。默认情况下,profiling是关闭的,你需要通过以下命令将其开启:
SET profiling = 1;- 执行要查看时间的sql语句,例如:
select * from user; - 如何调用方法:
查看执行时间。SHOW PROFILES;
其中Duration为SQL执行时间,Query即为执行的SQL语句。
2. 开启MySQL的日志记录
- 通过
set global slow_query_log = 'ON'开启日志记录。 - 通过
set global slow_query_time = 1即可设置慢SQL阈值,单位为秒,当超过设置时间时,就会被记录到日志中。 - 通过
show variables like 'slow_query_log'查询日志是否开启,以及存储位置。
3. 使用EXPLAIN分析查询
使用EXPLAIN或EXPLAIN ANALYZE来查看SQL的执行计划。这可以帮助你理解查询是如何执行的,例如是否使用了正确的索引,是否进行了全表扫描等。
以上各字段的意思:
- id:查询的标识符。每个SELECT查询都有一个唯一的标识符。如果查询中有子查询,这个ID可以显示子查询的顺序。
- select_type:查询的类型。常见的值包括:
- SIMPLE:简单的SELECT,不包含子查询或UNION。
- PRIMARY:查询中最外层的SELECT。
- UNION、DEPENDENT UNION:内层查询依赖于外层查询的结果集。
- UNION RESULT:UNION的结果集。
- SUBQUERY:子查询中的第一个SELECT。
- table:输出结果集的表。如果查询涉及多个表,此列表示MySQL决定按哪个表的顺序来连接它们。
- partitions:当前操作所涉及的分区。
- type:连接类型,显示MySQL决定如何连接表。常见的值包括:
- system:表只有一行(等于const)。
- const:表最多有一个匹配行。
- eq_ref:所有部分都使用了唯一索引或主键。
- ref:非唯一索引或唯一索引的非唯一前缀。
- fulltext:使用全文索引。
- ref_or_null:与ref类似,但增加了对NULL值的搜索。
- index_merge:表示使用了索引合并优化方法。
- unique_subquery:用于IN子查询,确保子查询返回唯一值。
- index_subquery:与unique_subquery类似,但可能返回非唯一值。
- range:对索引进行范围查找。
- index:全索引扫描,比全表扫描稍快。
- ALL:全表扫描。
- possible_keys:显示可能应用在这张表中的索引。
- key:实际使用的索引。如果为NULL,则没有使用索引。
- key_len:使用的索引的长度。
- ref:显示哪些列或常量被用于查找。
- rows:表示此操作需要扫描的行数,即扫描表中多少行才能得到结果。
- filtered:表示此操作过滤中保留的的行数占扫描行数的百分比。值越小,说明该步骤筛选掉的数据越多。
- Extra:表示其他额外的信息,包括Using index、Using filesort、Using temporary等。
二、优化方式
- 优化索引:
- 确保对查询中经常使用的列建立索引。
- 考虑使用联合索引,特别是当查询条件中包含多个列时。
- 避免过度索引,过多的索引会增加写操作的开销。
- 使用覆盖索引(Covering Index),即索引中包含查询需要的所有列,避免回表。
- 重构查询:
- 简化查询逻辑,避免使用复杂的子查询和连接(JOINs)。
- 使用WITH语句(Common Table Expressions, CTEs)来重构复杂的查询。
- 尽量减少数据处理的行数,例如通过增加WHERE条件来过滤掉不需要的行。
- 调整查询语句:
- 确保使用正确的数据类型和格式,这可以减少转换开销。
- 使用合适的聚合函数和分组(GROUP BY)策略。
- 避免在SELECT列表中使用不必要的计算或函数调用。
- 使用合适的表连接方式:
- 根据实际情况选择合适的连接类型(INNER JOIN, LEFT JOIN等)。
- 确保连接条件能够有效利用索引。
- 分页优化:
- 如果使用LIMIT和OFFSET进行分页,确保在WHERE子句中添加过滤条件,这样可以减少需要排序的数据量。
在Spring项目中的优化方式
- 缓存策略:
- 对于重复查询相同数据的情况,考虑使用应用层缓存(如Redis)或数据库缓存(如MySQL的Query Cache)。
- 批量操作:
- 对于批量插入、更新或删除操作,可以使用MyBatis的批量执行功能来减少数据库的访问次数。
- 使用缓存
- MyBatis 默认开启了一级缓存(即 SqlSession 级缓存),它会缓存当前 SqlSession 执行的查询结果。当你在同一个 SqlSession 内执行相同的查询时,会直接返回缓存的数据,而无需再次查询数据库。一级缓存作用范围仅限于同一个 SqlSession。
- 二级缓存:二级缓存是跨 SqlSession 共享的缓存,它能够提高应用程序的查询效率。二级缓存可以通过配置开启,并且支持使用外部缓存框架,如 Ehcache、Redis 等。
- 利用MyBatis的一级缓存和二级缓存来减少数据库访问次数。
- 可以考虑使用外部缓存框架(如Ehcache、Redis等)来进一步提升性能。
热门推荐
白术:传统中药的现代价值
后疫情时代下新业态用工确认劳动关系之诉探究
网络诈骗后怎么办?报警立案标准、起诉方式及追回财物全攻略
Excel表格输入限制内容怎么取消
数学中var是什么意思 数学中var是什么意思怎么读
国产动画电影的票房排行榜TOP10!
癫痫发作,要往嘴里塞东西防“咬舌自尽”?快住手!
从鹅湖之会看南宋四大书院的教育理念
两班倒工作制盛行,是进步还是倒退?
骨碎补细胞外纳米囊泡治疗骨质疏松研究新进展
2024西安交通大学在职研究生报考条件及流程
两会聚焦:如何为青少年心理健康“护航”?
如何制作美味的香菇干贝瘦肉粽子(传统粽子食谱的改良与创新)
家用小轿车使用年限一般是多久?你知道吗?
真相!到底吃哪种解酒药能快速解酒?看完这篇再决定喝几杯
如何制定高效的年度计划?掌握这些技巧让你事半功倍!
说好普通话带来的好处,更方便交流和提升个人气场
48V低压供电网络研究:Cybertruck引领,48V零部件供应链迎来全新机遇
70个绝美词牌名,一键收藏!
一天喝多少毫升茶最适宜?专家建议来了
创业目标管理项目怎么写
C语言中覆盖数组元素的三种方法详解
寓意美好的少见字:汉字文化的瑰宝
未来10年,前景最好的5个行业,选对了吃喝不愁
空喊多年的“因材施教”在人工智能支持下正逐渐从理想变为现实
踝部骨折的治疗原则是什么
A股成交额逼近2万亿!民企座谈会提振市场信心
学校教师标准课时量计算办法的试行方案
鼻息肉鼻窦炎手术全解析:结构、风险与术后护理
面试前如何了解公司背景、企业文化?