MySQL 8.0如果只能优化一个SQL,选哪个?(译文)

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 回答这个问题并不容易。像很多问题一样,最好的回答是“这要看情况...”! 但是,让我们试着给你所有必要的信息来提供最准确的答案。另外,仅仅修复一个SQL可能不够,查找一个有问题的SQL可能会找到多个有问题的SQL。

回答这个问题并不容易。像很多问题一样,最好的回答是“这要看情况...”!  但是,让我们试着给你所有必要的信息来提供最准确的答案。另外,仅仅修复一个SQL可能不够,查找一个有问题的SQL可能会找到多个有问题的SQL。

01

最慢的SQL


第一个要优化的候选项是执行时间最长的SQL。为了找到它,我们将使用sys模式与来自performance_schema的视图events_statements_summary_by_digest进行连接(参见:https://lefred.be/content/mysql-8-0-digest-query-samples-in-performance_schema/)。  让我们看看sys模式为我们提供了哪些与我们这项任务相关的内容:





> show tables like 'statements_with%';+---------------------------------------------+| Tables_in_sys (statements_with%)            |+---------------------------------------------+| statements_with_errors_or_warnings          || statements_with_full_table_scans            || statements_with_runtimes_in_95th_percentile || statements_with_sorting                     || statements_with_temp_tables                 |+---------------------------------------------+

然后,我们将使用statements_with_runtimes_in_95th_percentile来查找最慢的SQL语句。然而,我们将使用带有原始数据的视图版本(不是人类可读的格式),以便能够按照我们想要的方式对结果进行排序。sys模式视图的原始数据版本以x$开头:





SELECT schema_name, sys.format_time(total_latency) tot_lat,          exec_count, sys.format_time(total_latency/exec_count) latency_per_call,        query_sample_text   FROM sys.x$statements_with_runtimes_in_95th_percentile AS t1  JOIN performance_schema.events_statements_summary_by_digest AS t2     ON t2.digest=t1.digest  WHERE schema_name NOT in ('performance_schema', 'sys') ORDER BY (total_latency/exec_count) desc LIMIT 1\G*************************** 1. row ***************************      schema_name: library          tot_lat: 857.29 ms       exec_count: 1 latency_per_call: 857.29 msquery_sample_text: INSERT INTO `books` (`doc`) VALUES ('{\"_id\": \"00005d44289d000000000000007d\", \"title\": \"lucky luke, tome 27 : l alibi\", \"isbn10\": \"2884710086\", \"isbn13\": \"978-2884710084\", \"langue\": \"français\", \"relié\": \"48 pages\", \"authors\": [\"Guylouis (Auteur)\", \"Morris (Illustrations)\"], \"editeur\": \"lucky comics (21 décembre 1999)\", \"collection\": \"lucky luke\", \"couverture\": \" data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABQODxIPDRQSEBIXFRQYHjIhHhwcHj0sLiQySUBMS0dARkVQWnNiUFVtVkVGZIhlbXd7gYKBTmCNl4x9lnN+gXz/2wBDARUXFx4aHjshITt8U0ZTfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHz/wAARCAEfANwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBA...1 row in set (0.2838 sec)

优化这个语句很困难,因为它是一个简单的插入,并且只运行了一次。由于磁盘响应时间的原因,Insert可能会慢一些(写磁盘的方式是完全持久)。拥有太多的索引也会增加响应时间,这就是我建议您查看这两个sys模式视图的原因:

  • schema_redundant_indexes
  • schema_unused_indexes

由于有query_sample_text字段,我们可以使用explain来生成这个SQL的执行计划。

02

全表扫描的SQL


另外一类我建议需要优化的SQL是执行全表扫描的SQL:




SELECT schema_name, sum_rows_examined, (sum_rows_examined/exec_count) avg_rows_call,       sys.format_time(total_latency) tot_lat, exec_count,       sys.format_time(total_latency/exec_count) AS latency_per_call,       query_sample_text   FROM sys.x$statements_with_full_table_scans AS t1  JOIN performance_schema.events_statements_summary_by_digest AS t2     ON t2.digest=t1.digest  WHERE schema_name NOT in ('performance_schema', 'sys') ORDER BY (total_latency/exec_count) desc LIMIT 1\G*************************** 1. row ***************************       schema_name: wp_lefred sum_rows_examined: 268075     avg_rows_call: 3277.0419           tot_lat: 31.31 s        exec_count: 124  latency_per_call: 252.47 ms query_sample_text: SELECT count(*) as mytotal                 FROM wp_posts                 WHERE (post_content LIKE '%youtube.com/%'                    OR post_content LIKE '%youtu.be/%')                 AND post_status = 'publish' 1 row in set (0.0264 sec)

我们可以看到这个查询执行了124次,总执行时间为31.31秒,也就是说每次调用执行252.47毫秒。我们还可以看到,该查询检查了超过268k行,这意味着平均而言,这些全表扫描每个查询检查3277条记录。  这是一个非常值得优化的SQL。

03

使用临时表的SQL


创建临时表对于数据库应用来说也不是最优的,如果您有一些很慢的SQL,您应该已经在前面的查询中识别出它们。但是,如果您想专门寻找它们,sys 模式可以帮助您捕捉它们:




SELECT schema_name, sys.format_time(total_latency) tot_lat, exec_count,        sys.format_time(total_latency/exec_count) latency_per_call, query_sample_text   FROM sys.x$statements_with_temp_tables AS t1  JOIN  performance_schema.events_statements_summary_by_digest AS t2    ON t2.digest=t1.digest  WHERE schema_name NOT in ('performance_schema', 'sys') AND disk_tmp_tables=1ORDER BY 2 desc,(total_latency/exec_count) desc LIMIT 1\G

幸运的是,我的系统里没有。  

04

结束语


查询优化并不是DBA工作中最令人兴奋的部分……但却是必须要做的;-)。你现在已经有了一个简单的方法来找到从哪里开始,祝你好运!别忘了,如果你需要任何帮助,你可以随时加入MySQL社区Slack频道!(https://lefred.be/mysql-community-on-slack/

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
SQL 关系型数据库 MySQL
MySQL 保姆级教程(一):了解 SQL
MySQL 保姆级教程(一):了解 SQL
|
3天前
|
SQL 关系型数据库 MySQL
"超级攻略:如何快速排查和优化慢SQL,提升系统速度!"
摘要: 在公司中,SQL查询超1秒被视为慢查询。要排查慢查询,启用MySQL的慢查询日志(`slow_query_log = 1`,`long_query_time = 1`),然后分析`mysql-slow.log`。慢查询可能因缺少索引、不当使用索引、字段过多、多次回表、JOIN操作、深度分页或其他因素导致。通过优化表结构、添加索引、调整SQL和数据库配置来提高性能。定位问题关键,如使用`EXPLAIN`分析执行计划。详细教程和解决方案可在相关文章中找到。
|
8天前
|
SQL 运维 监控
MSSQL性能调优实战技巧:索引优化、SQL查询优化与并发控制策略
在Microsoft SQL Server(MSSQL)的运维过程中,性能调优是确保数据库高效运行、满足业务需求的关键环节
|
7天前
|
SQL 安全 关系型数据库
【SQL】已解决:MySQL 服务无法启动
【SQL】已解决:MySQL 服务无法启动
41 1
|
2天前
|
关系型数据库 MySQL API
MySQL上亿数据查询优化:实践与技巧
MySQL亿级数据查询优化涉及索引设计、分区表、查询语句优化和数据库架构调整。例如,通过为常用查询列创建索引、使用EXPLAIN分析查询计划、避免全表扫描和SELECT *,以及采用垂直拆分、水平拆分和读写分离来提升性能。分区表能减少查询数据量,API接口测试可验证优化效果。
8 0
|
5天前
|
SQL 监控 Java
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
10 0
|
6天前
|
SQL 存储 关系型数据库
常见的一些SQL优化方式
SQL 优化是提高数据库性能和查询效率的重要手段。
10 0
|
7月前
|
SQL 存储 关系型数据库
MySQL下使用SQL命令进行表结构与数据复制实践
MySQL下使用SQL命令进行表结构与数据复制实践
91 0
|
12月前
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉2
MySQl数据库第八课-------SQL命令查询-------主要命脉
|
12月前
|
SQL 关系型数据库 MySQL
MySQl数据库第八课-------SQL命令查询-------主要命脉 1
MySQl数据库第八课-------SQL命令查询-------主要命脉