【发布时间】: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 秒。
标签: sql select sqlite query-optimization