连接表性能的ORDER BY列

Pet*_*ler 5 mysql sql database performance

我有1:1关系的2个表(但将来可能会变成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;
Run Code Online (Sandbox Code Playgroud)

我需要做的是选择文章依据;通过article_top.until DESC和之后article.inserted DESC(因此,“顶”的文章都在上面,其余的从最新分类到最旧)。

我执行以下查询,这很慢(当我跳过article_top.untilORDER BY子句中的时很快):

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
Run Code Online (Sandbox Code Playgroud)

除了将两个表合并为一个表(丢失1:N关系的可能性)之外,我还可以做一些优化查询的事情吗?

我正在考虑向表中添加其他列,article并使用触发器对其进行更新。这样,我可以将索引添加到两个列中,并且排序应该更快。

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

谢谢

nob*_*ody 1

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

INDEX( top_until, inserted )
Run Code Online (Sandbox Code Playgroud)

并像这样查询:

SELECT * FROM article 
   ORDER BY top_until DESC, inserted DESC
   LIMIT 20
Run Code Online (Sandbox Code Playgroud)

这应该立即给出结果。