SQLite3-我怎样才能加快这个 SELECT 查询?

Posted

技术标签:

【中文标题】SQLite3-我怎样才能加快这个 SELECT 查询?【英文标题】:SQLite3- how can I speed up this SELECT query? 【发布时间】:2018-08-15 19:02:35 【问题描述】:
SELECT DISTINCT sid,
    usrname,
    errcode,
    msg,
    DATE,
    TIME
FROM ecode e,
    action a
WHERE e.errcode = a.STATUS LIMIT 250;

我正在开发一个工具来查看服务器日志,但是这个查询非常慢,我不知道为什么(我对 SQL 很陌生,所以它可能是一些基本的东西)。我正在针对服务器日志数据库运行此查询。 errcode 和 msg 来自 ecode 表,所有其他属性来自 action 表(大约有 100k 个条目)。 ecode 表包含我们认为错误的某些状态代码的列表。无论我将它限制为多少个结果(无论是 25 还是整个表),这个查询都需要大约 8 秒来执行,所以我怀疑这是罪魁祸首。我在这里做错了什么?

【问题讨论】:

也许你应该看看你的索引使用情况。见here。 为什么要使用 DISTINCT?您是否知道没有 ORDER BY 时 LIMIT 没有多大意义? @JeroenHeier 是的,索引大大提高了速度。 @CL。我最初并没有编写此查询(原始查询包含在另一个 SELECT 查询中,该查询将对结果进行排序。您对 DISTINCT 的看法是正确的,由于服务器如何保存日志,这完全没有意义),但我能够大幅改进通过索引几列并使用 WHERE 子句从查询运行的同一天提取错误而不是 LIMIT 来提高效率。将查询从 ~8 秒缩短到 ~1 秒。 【参考方案1】:

确保你有正确的索引

 table ecode column  errcode 
 table action column status  

和(一个建议)你应该使用显式加入 sintax

  SELECT DISTINCT sid, usrname, errcode, msg, date, time 
  FROM ecode e
  INNER JOIN  action a ON   e.errcode = a.status 
  LIMIT 250 

【讨论】:

是的,就是这样。使用索引和连接(以及将其重写为不使用 LIMIT)将查询从 ~8 秒缩短到 ~1 秒。谢谢!

以上是关于SQLite3-我怎样才能加快这个 SELECT 查询?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能加快这个迭代?

我怎样才能加快这个 Anagram 算法

我怎样才能加快这个汇总报价行行负载的视图?

我的子查询将执行时间增加了 20 秒。我怎样才能加快速度?

如何加快sql查询执行速度?

双连接查询需要 540 秒才能运行 - 我怎样才能加快速度?