MySQL 上的 SQL 查询花费了三秒钟的时间,而数据库或 SQL 查询没有任何更改

Posted

技术标签:

【中文标题】MySQL 上的 SQL 查询花费了三秒钟的时间,而数据库或 SQL 查询没有任何更改【英文标题】:SQL query on MySQL taking three second longer with no changes to the database or to the SQL query 【发布时间】:2019-12-20 22:37:32 【问题描述】:

我被要求诊断为什么查询看起来像这样

SELECT COUNT(*) AS count 
FROM users 
WHERE first_digit BETWEEN 500 AND 1500 
  AND second_digit BETWEEN 5000 AND 45000;

从大约 0.3 秒突然执行到 3 秒以上。系统是在 Ubuntu 上运行的 mysql

该表未排序,包含大约 150 万行。添加复合索引后,执行时间再次降低到 0.2 秒左右,但这并不能解释执行时间突然呈指数增长的根本原因。

我该如何着手调查造成这种情况的原因?

【问题讨论】:

第一步,查看解释计划。 执行计划保持不变,我知道这是事实。问题必须在 MySql 外部。 网络问题.. 如果您删除新索引,查询是否会再次达到 3 秒? 请告诉我们SHOW CREATE TABLEEXPLAIN SELECT 【参考方案1】:

由于您的 SQL 查询没有改变,我将您的描述解释为数据集没有改变/增长 - 我建议您按顺序查看以下区域:

1) 您是否删除了索引并再次运行 SQL 查询?

2) 对数据库的其他访问。其他应用程序或用户是否在同一数据库上运行繁重的查询?更大的数据传输,尤其是与相关数据库服务器之间的数据传输。

【讨论】:

【参考方案2】:

减速 10 倍?一个可能的原因是从完全缓存变为未缓存。

请告诉我们SHOW CREATE TABLEEXPLAIN SELECT、RAM 大小和 innodb_buffer_pool_size 的值。表有多大 (GB)?

另外,在减速之前是否有人碰巧做了转储或ALTER TABLEOPTIMIZE TABLE

以上信息将显示导致缓存失败的原因,或显示需要更多 RAM。

INDEX(first_digit, second_digit)(以任意顺序)将“覆盖”该查询;这将比没有任何索引更快。

【讨论】:

以上是关于MySQL 上的 SQL 查询花费了三秒钟的时间,而数据库或 SQL 查询没有任何更改的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询打破了我们的游戏! (后端服务器满负荷)

带有连接和group by子句的选择查询中的MySQL性能问题

如果 SQL 查询花费更多时间并且 CONN_MAX_AGE 的剩余年龄更短,会发生啥情况?

MySQL批量SQL插入性能优化

MySQL批量SQL插入性能优化详解

MySQL批量SQL插入各种性能优化