Ответ 1
Ваш подзапрос:
SELECT * # Select Number 2
FROM post
WHERE parentid = 13
ORDER BY time, id
LIMIT 1, 10;
Это упоминает три столбца явно, плюс все остальные столбцы. У вас есть три индекса. Вот как они могут быть использованы:
- id (PRIMARY) - Этот индекс бесполезен. Хотя упоминается в предложении
order by
, это второе условие - parentid - этот индекс может использоваться для выполнения предложения
where
. Однако после того, как правильные данные будут вытащены, необходимо будет отсортировать их явно. - time, id (timeid) - этот индекс может использоваться для сортировки с большим НО. MySQL может сканировать индекс, чтобы получить все в правильном порядке. Но ему придется проверять, по очереди, выполняется ли условие на
parentid
.
Просто чтобы понять, почему оптимизация сложна. Если у вас небольшой объем данных (скажем, таблица соответствует одной или двум страницам), то полное сканирование таблицы, за которым следует сортировка, вероятно, отлично. Если большинство значений parentid
13
, то второй индекс может быть наихудшим. Если таблица не вписывается в память, тогда третья будет невероятно медленной (что-то называется перетасовкой страницы).
Правильный индекс для этого подзапроса - это тот, который удовлетворяет предложению where
и позволяет упорядочивать. Этот индекс parentid, time, id
. Это не индекс покрытия (если только это не все столбцы в таблице). Но это должно уменьшить количество обращений к фактическим строкам до 10 из-за предложения limit
.
Обратите внимание, что для полного запроса вам нужен индекс в parentid
. И, к счастью, индекс на parentid, time, id
считается таким индексом. Таким образом, вы можете удалить этот индекс. Индекс time, id
, вероятно, не нужен, если вам это не требуется для других запросов.
Ваш запрос также фильтрует только те "дети", у которых есть "дети". Вполне возможно, что никакие строки не будут возвращены. Вы действительно намереваетесь left outer join
?
В качестве последнего комментария. Я предполагаю, что этот запрос упрощает ваш реальный запрос. Запрос вытягивает все столбцы из двух таблиц - и эти две таблицы одинаковы. То есть вы будете получать повторяющиеся имена столбцов из одинаковых таблиц. Вы должны иметь псевдонимы столбцов, чтобы лучше определять столбцы.