Столбец ORDER BY производительности объединенной таблицы - PullRequest
4 голосов
/ 05 августа 2011

У меня есть 2 таблицы в отношении 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 (поэтому «верхние» статьи находятся сверху, а остальные отсортированы от самых новых к самым старым).

Я выполняю следующий запрос, который выполняется медленно (быстро, когда я пропускаю article_top.until в предложении ORDER BY):

* * 1010

Могу ли я что-то сделать для оптимизации запроса, кроме объединения двух таблиц в одну (потеря возможности отношения 1: N)?

Я думал о добавлении дополнительного столбца в таблицу article и использовании триггеров для его обновления. Таким образом, я мог бы добавить индекс к обоим столбцам, и порядок должен быть быстрее.

Есть ли другой способ оптимизации запроса?

Спасибо

1 Ответ

1 голос
/ 05 августа 2011

Добавьте столбец 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

Это должно дать результаты мгновенно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...