MySQL: Присоединяйтесь и используя индекс в заказе по запросу
-
28-09-2019 - |
Вопрос
У меня есть система, которая похожа на функцию Q & A для StackoverFlow. Главное отличие - это шляпа, каждый вопрос имеет срок действия данных:
CREATE TABLE questions (
id INT NOT NULL AUTO_INCREMENT,
title CHAR(100) NOT NULL,
details TEXT
PRIMARY KEY (id)
)
CREATE TABLE answers (
id INT NOT NULL AUTO_INCREMENT,
question_id INT NOT NULL
details TEXT
expiration_datetime DATETIME
score INT
PRIMARY KEY (id)
)
Я хочу показать вопрос вместе с вершинами N безъясняемых ответов, заказанных по оценке. Я думаю что-то вроде этого:
SELECT * FROM questions, answers
WHERE questions.id=1 AND questions.id=answers.question_id AND answers.expiration_datetime > NOW()
ORDER BY answers.score DESC LIMIT 10
Несколько вопросов:
1) - это запрос выше наиболее эффективного способа сделать то, что я хочу? Как он отличается от явных, использующих соединение, такое как:
SELECT * FROM questions JOIN answers ON questions.id=answers.question_id
WHERE questions.id=1 AND answers.expiration_datetime > NOW()
ORDER BY answers.score DESC LIMIT 10
2) Как сделать мой запрос использовать индекс? Я думаю, добавляя этот индекс к ответу на таблицу:
INDEX (question_id, expiration_datetime, score)
Будет ли вышеупомянутый индекс работать на мой запрос? Это не кажется правильным, потому что истечение_dateTime восходит, пока мне нужно оценку с ними. Что я могу сделать здесь?
Решение
Таблицы присоединения с внутренним присоединением или в пункте «Из из» дают тот же план выполнения. Тем не менее, первое гораздо легкое прочитать (и это то, что стандарт предложит с 1992 года).
Ваши RDBMS будут использовать индекс, когда это возможно. Обычно это хорошая идея для печати плана исполнения (EXPLAIN SELECT * FROM -- ...
). Однако обратите внимание, что создание индекса нескольких столбцов может быть сложно. В вашем случае вы можете использовать индекс на вопрос_id, но нет По истечении срока действия или оценки, потому что они не являются первыми столбцами индекса. Вы должны были бы сделать три разных индекса.
PS SELECT * не рекомендуется. Всегда введите необходимые столбцы (легко читать и перечитать) и упомянуть только столбцы, которые вы будете использовать. Нет смысла, чтобы выбрать, например, INALITY_DATE, если вы никогда не используете этот столбец в своем скрипте!