我正在跟踪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;
这是EXPLAIN指令:
正如您所看到的,它需要3秒钟,有时需要2秒钟,而且工作非常频繁,因此,它在mysql-slow.log中显得很多。 你看到我可以改变的东西吗?我试图考虑查询,更改索引...但是我这没什么。
非常感谢, 问候!
答案 0 :(得分:1)
对于此查询:
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)
上建立索引。这是一个包含三列的复合索引。
答案 1 :(得分:0)
以下索引可以提高性能:
create index ix1 on table_tmp (ns, ws, id);
如果仍然很慢,那么下一个索引可以进一步提高性能:
create index ix2 on table_tmp (id, ns, ws);