mysql - Mysql 中查询速度慢,性能不佳。 mysql-slow.log 中查询时间较长

标签 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;

这里是解释说明:

enter image description here

  1. “table_tmp”大约有 90 万行。
  2. “table_tmp”在“ns”、“id”中具有索引(自动增量,主索引)
  3. 我需要得到的是当“ws”为!='-'时的最后一行。我们可以这么说,我在数据库中查找“ws”!=“-”的时刻,然后我选择下一个“id”,即上面一行。
  4. 有许多不同的“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/

相关文章:

php - 3gp 罚款未转移到数据库

sql - 操作集合

sql - 查询以查找在 sqlite 中存储为邻接列表的树中的下一个项目

mysql - 在SQL中更改PK,由于FK而不起作用

mysql - Rails 无法使用 rake db :create?

mysql - Maya 和数据库

php - 如何处理从 books-table 查询返回的多个作者

sql - 数据库中用于删除行的主键或常规字段?

MySQL 5.7 准备好的语句更新了错误的时间戳列

android - 尝试访问从 Assets 到数据\数据\的复制数据库中的 DatabaseHelper 时出现空指针异常