我有一个类似于 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)上面的查询是做我想做的最有效的方法吗?它与显式使用 JOIN 有何不同,例如:
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)如何让我的查询使用索引?我正在考虑将此索引添加到 TABLE 答案中:
INDEX (question_id, expiration_datetime, score)
上述索引是否适用于我的查询?这似乎不正确,因为 expire_datetime 正在上升,而我需要 score 下降。我可以在这里做什么?