【发布时间】:2017-10-29 20:33:24
【问题描述】:
我正在使用 SQLite 3。我有一个表 forums,有 150 行,还有一个表 posts,有大约 440 万行。每个帖子都属于一个论坛。
我想选择每个论坛最新帖子的时间戳。如果我要求一个最新的帖子,SELECT MAX(timestamp) FROM posts WHERE forum_id = 5,平均需要 40 毫秒。
我要求提供所有论坛的列表及其最新帖子
SELECT forums.name, max(posts.timestamp)
FROM posts
JOIN forums ON posts.forum_id = forums.id
GROUP BY forums.name
它有效,但需要 500 秒 -- 超过 12,000 倍的时间,而选择只有 150 倍。如果我只是在我的应用程序中编写一个循环来发出 150 个单独的选择查询,它会快得多。
我确实在posts.timestamp 上创建了一个索引,并在posts.timestamp, posts.forum_id 上创建了一个组合索引。它没有帮助。
我做错了什么?
【问题讨论】:
-
你的索引是什么样的?
-
你为什么不直接按
forum_id分组? -
我的索引是
CREATE INDEX forums_name ON posts (forum_id ASC)和CREATE INDEX time_and_forum ON posts (timestamp DESC, forum_id ASC)。 -
你需要反转time_and_forum索引中的列