0

stackoverflow の Q&A 機能に似たシステムがあります。主な違いは、各質問に有効期限があることです。

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)

上記のインデックスは私のクエリで機能しますか? スコアを降順にする必要があるのに、expiration_datetime が昇順であるため、正しくないようです。ここで何ができますか?

4

1 に答える 1

0

INNER JOINまたはFROM句でテーブルを結合すると、同じ実行プランが得られます。ただし、前者の方がはるかに読みやすくなっています(これは、1992年以降の標準の提案です)。

RDBMSは、可能な限りインデックスを使用します。通常、実行プラン(EXPLAIN SELECT * FROM -- ...)を印刷することをお勧めします。ただし、複数列のインデックスを作成するのは難しい場合があることに注意してください。あなたの場合、question_idのインデックスを使用できますが、expiration_datetimeまたはscoreはインデックスの最初の列ではないため、使用できません。3つの異なるインデックスを作成する必要があります。

PSSELECT*は推奨されません。常に必要な列を入力し(読みやすく、読み直しやすい)、使用する列についてのみ言及してください。スクリプトでこの列を使用したことがない場合は、たとえば、initial_dateを選択しても意味がありません。

于 2010-11-02T18:03:04.357 に答える