我有1个1:1关系的表(但未来可能会成为1:N关系)如下:
CREATE TABLE article (
article_id INT,
inserted DATETIME
) ENGINE InnoDB;
CREATE TABLE article_top (
article_top_id INT,
article_id INT,
until DATETIME
) ENGINE InnoDB;
我需要做的是选择首先由article_top.until DESC
排序并在article.inserted DESC
之后排序的文章(因此“顶部”文章位于顶部,其余文章从最新到最旧排序)
我执行以下查询,这很慢(当我跳过ORDER BY子句中的article_top.until
时速度很快):
SELECT * FROM article
LEFT JOIN article_top
ON article.article_id = article_top.article_id
ORDER BY article_top.until DESC, article.inserted DESC
LIMIT 20
除了将两个表合并为单个表(丢失1:N关系的可能性)之外,我还能做些什么来优化查询?
我正在考虑向表article
添加其他列并使用触发器来更新它。这样我就可以为两列添加索引,并且排序应该更快。
还有其他方法可以优化查询吗?
谢谢
答案 0 :(得分:1)
将top_until
列添加到article
表并从article_top
表复制其值(在插入时或使用触发器手动),并提供不在article_top表中的文章零“top_until”值。然后在top_until
和inserted
列上添加多列索引:
INDEX( top_until, inserted )
并像这样查询:
SELECT * FROM article
ORDER BY top_until DESC, inserted DESC
LIMIT 20
这应该立即给出结果。