连接表性能的ORDER BY列

时间:2011-08-05 13:11:41

标签: mysql sql database performance

我有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添加其他列并使用触发器来更新它。这样我就可以为两列添加索引,并且排序应该更快。

还有其他方法可以优化查询吗?

谢谢

1 个答案:

答案 0 :(得分:1)

top_until列添加到article表并从article_top表复制其值(在插入时或使用触发器手动),并提供不在article_top表中的文章零“top_until”值。然后在top_untilinserted列上添加多列索引:

INDEX( top_until, inserted )

并像这样查询:

SELECT * FROM article 
   ORDER BY top_until DESC, inserted DESC
   LIMIT 20

这应该立即给出结果。