我正在跟踪 Mysql 流量,并且面临一个查询,其中包含大量条目,每个事务都浪费大量时间。 以下是来自 mysql-slow.log 的示例:
# Time: 190301 0:00:36
# User@Host: localhost []
# Query_time: 3.318860 Lock_time: 0.000077 Rows_sent: 1
Rows_examined: 4913
SET timestamp=1551394836;
SELECT *
FROM `table_tmp`
WHERE `ns` = '123456'
AND `ws` = '-'
AND `id` > (
SELECT MAX(`id`)
FROM `table_tmp`
WHERE `ns` = '123456' AND `ws` != '-'
ORDER BY `id` DESC)
ORDER BY `id` ASC
LIMIT 1;
这里是解释说明:
- “table_tmp”大约有 90 万行。
- “table_tmp”在“ns”、“id”中具有索引(自动增量,主索引)
- 我需要得到的是当“ws”为!='-'时的最后一行。我们可以这么说,我在数据库中查找“ws”!=“-”的时刻,然后我选择下一个“id”,即上面一行。
- 有许多不同的“ns”。
因为你可以看到它需要3秒,有时2秒,而且工作很频繁,所以,它在mysql-slow.log中出现很多。 你看到我可以改变什么吗?我试图考虑查询、更改索引...但我什么也没考虑。
非常感谢, 问候!
最佳答案
对于此查询:
SELECT t.*
FROM table_tmp t
WHERE t.ns = 123456 AND -- it looks like a number so I assume it is
t.ws = '-' AND
t.id > (SELECT MAX(t2.id)
FROM table_tmp t2
WHERE t2.ns = t.ns AND t2.ws <> '-'
)
ORDER BY id ASC
LIMIT 1;
我建议在 table_tmp(ns, ws, id)
上建立索引。这是一个包含三列的复合索引。
关于mysql - Mysql 中查询速度慢,性能不佳。 mysql-slow.log 中查询时间较长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55026368/