在Mysql中查询缓慢会导致性能下降。 mysql-slow.log中的高查询时间

时间:2019-03-06 15:13:44

标签: mysql sql

我正在跟踪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指令:

enter image description here

  1. 'table_tmp'大约有90万行。
  2. “ table_tmp”在“ ns”,“ id”(自动递增,主要)中具有索引
  3. 我需要得到的是“ ws”为!='-'时的最后一行。可以这么说,我使用“ ws”!='-'搜索数据库,然后选择下一个“ id”,即上一行。
  4. 有许多不同的“ ns”。

正如您所看到的,它需要3秒钟,有时需要2秒钟,而且工作非常频繁,因此,它在mysql-slow.log中显得很多。 你看到我可以改变的东西吗?我试图考虑查询,更改索引...但是我这没什么。

非常感谢, 问候!

2 个答案:

答案 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);