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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 回答这个问题并不容易。像很多问题一样,最好的回答是“这要看情况...”! 但是,让我们试着给你所有必要的信息来提供最准确的答案。另外,仅仅修复一个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
相关文章
|
11天前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
10天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
19天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
66 10
|
16天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
44 3
|
18天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
18天前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
42 1
|
20天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
92 1
|
20天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
49 0
|
22天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
34 0
|
22天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
下一篇
无影云桌面