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 TABLE
和EXPLAIN SELECT
。
【参考方案1】:
由于您的 SQL 查询没有改变,我将您的描述解释为数据集没有改变/增长 - 我建议您按顺序查看以下区域:
1) 您是否删除了索引并再次运行 SQL 查询?
2) 对数据库的其他访问。其他应用程序或用户是否在同一数据库上运行繁重的查询?更大的数据传输,尤其是与相关数据库服务器之间的数据传输。
【讨论】:
【参考方案2】:减速 10 倍?一个可能的原因是从完全缓存变为未缓存。
请告诉我们SHOW CREATE TABLE
。 EXPLAIN SELECT
、RAM 大小和 innodb_buffer_pool_size
的值。表有多大 (GB)?
另外,在减速之前是否有人碰巧做了转储或ALTER TABLE
或OPTIMIZE TABLE
。
以上信息将显示导致缓存失败的原因,或显示需要更多 RAM。
INDEX(first_digit, second_digit)
(以任意顺序)将“覆盖”该查询;这将比没有任何索引更快。
【讨论】:
以上是关于MySQL 上的 SQL 查询花费了三秒钟的时间,而数据库或 SQL 查询没有任何更改的主要内容,如果未能解决你的问题,请参考以下文章
带有连接和group by子句的选择查询中的MySQL性能问题