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 查询?的主要内容,如果未能解决你的问题,请参考以下文章