我们正在运行一个 LAMP 堆栈,其中包括 Centos 7 上的 MariaDB 10.5.15。它是一台具有 4 个 CPU 和 8GB RAM 的专用服务器。
直到最近几周才遇到问题,我注意到慢查询日志中的慢查询需要 8-9 秒。
这些查询针对多个 INNODB 数据库,但始终是大型表(即 10,000+ 行)。它们总是发生在上午 6 点到 8 点之间。
所讨论的表有索引,并且相同的查询通常执行时间不到一秒。
我发现,在周日早上 8 点登录服务器并使用简单的 select 语句查询这些大型表,它们需要 8-9 秒才能执行。然后,在当天的剩余时间里,甚至在午夜之后,针对该表的任何查询都会很快。
上午 6 点至 8 点也是万物在经过凌晨一段时间的沉寂之后“恢复生机”的时间。
似乎某种缓存正在变冷,需要预热,但我不确定为什么在多年无故障使用后突然发生这种情况。据我所知,服务器上没有在夜间运行大型进程,发生这种情况时服务器也没有处于负载状态。
我们全天候监控 CPU 负载,并定期检查 Apache 和 MariaDB 的连接数,这些连接数全天都保持在较低水平。通常,除了缓冲区和缓存外,大约有 3GB 的内存可用。
编辑
令人尴尬的是,我发现有问题的慢查询实际上没有使用索引,而是在进行全表扫描。初始查询可能需要几秒钟,然后在一天的剩余时间内,甚至全表扫描也只需不到一秒钟。我假设这是某种磁盘缓存,它在一夜之间就变冷了。
虽然全表扫描出现性能问题似乎并不罕见,但突然间这个问题成为一个问题似乎还是很奇怪。
答案1
您似乎已经排除了夜间转储和一些缓慢的过程?
更多调试建议:
降低全局设置long_query_time
并保持 slowlog 处于打开状态;您可能会抓住恶棍。
您的查询运行频率是多少?我在这里要寻找的是缩短查询变慢的时间。
检查SHOW GLOBAL STATUS LIKE "Uptime"
如果小于 86400,则 MariaDB 已在不到 24 小时前重新启动。在这种情况下,您应该能够将时间精确到秒。(但无法确定原因)。
向我们显示查询,加上SHOW CREATE TABLE
我们EXPLAIN...
也许能够帮助您加快速度(例如,通过更好的索引或查询的重新表述),从而消除问题(尽管没有解决原因)。