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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 回答这个问题并不容易。像很多问题一样,最好的回答是“这要看情况...”! 但是,让我们试着给你所有必要的信息来提供最准确的答案。另外,仅仅修复一个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天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
42 18
|
4天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
16 7
|
3天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
22 5
|
23小时前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
21 9
|
11天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
10天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
35 3
|
13天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
15天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
SQL 关系型数据库 索引
SQL优化常用方法53
分离表和索引
1330 0
|
SQL
SQL优化常用方法51
使用显式的游标(CURSORs)
1102 0