我有一个类似于Stackoverflow的问答功能的系统。主要区别是HAT每个问题都有一个到期日期:

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)

以上索引适用于我的查询吗?这似乎是不正确的,因为Expiration_Datetime在我需要得分下降的同时上升。我可以在这里做什么?

有帮助吗?

解决方案

将表与内部连接或从子句中进行的联合表提供相同的执行计划。但是,前者更容易阅读(这就是自1992年以来的标准建议)。

您的RDBM会尽可能使用索引。打印执行计划通常是一个好主意(EXPLAIN SELECT * FROM -- ...)。但是,请注意,创建多列索引可能很棘手。就您而 不是 在Expiration_DateTime或得分上,因为它们不是索引的第一列。您将必须制作三个不同的索引。

ps select *不推荐 *。始终键入所需的列(易于阅读和重新阅读),并且仅提及要使用的列。如果您从未在脚本中使用此列,则无需选择initial_date!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top