MySQL: Присоединяйтесь и используя индекс в заказе по запросу

StackOverflow https://stackoverflow.com/questions/4080621

Вопрос

У меня есть система, которая похожа на функцию 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, если вы никогда не используете этот столбец в своем скрипте!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top