Frage

Ich habe ein System, das auf die Q & A-Funktion von Stackoverflow ähnlich ist. Der Hauptunterschied ist hat jede Frage eine Verfallsdatumzeit 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)
) 

Ich mag mit dem Top-N nicht abgelaufenen Antworten Punktzahl bestellt eine Frage zusammen angezeigt werden soll. Ich denke, so etwas wie folgt aus:

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

Ein paar Fragen:

1) Ist die Abfrage über die effizienteste Art und Weise zu tun, was ich will? Wie unterscheidet es sich von explizit mit JOIN wie:

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) Wie kann ich meine Abfrage verwenden Sie den Index machen? Ich denke, diesen Index TABELLE Antworten hinzu:

INDEX (question_id, expiration_datetime, score)

Würde der oben Index Arbeit für meine Frage? Es scheint nicht richtig, weil expiration_datetime aufsteigend, während ich zu absteigend punkten muss. Was kann ich hier tun?

War es hilfreich?

Lösung

Fügen Tabellen mit INNER JOIN oder in der FROM-Klausel Plan die gleiche Ausführung gibt. erstere ist jedoch viel leichter zu lesen (und das ist, was Standard vorschlägt seit 1992).

Ihr RDBMS einen Index verwenden, wann immer es möglich ist. Es ist in der Regel eine gute Idee, den Ausführungsplan (EXPLAIN SELECT * FROM -- ...) zu drucken. Beachten Sie jedoch, dass sein mehrere Spalten-Index erstellen kann tückisch. In Ihrem Fall können Sie den Index auf question_id verwenden, aber nicht auf expiration_datetime oder Partitur, weil sie nicht die ersten Spalten des Index sind. Sie müßten drei verschiedenen Index machen.

P. S. SELECT * wird nicht empfohlen. Immer die Spalten geben Sie brauchen (leicht zu lesen und wieder lesen) und nur die Spalten erwähnen Sie verwenden werden. Kein Punkt zu wählen, zum Beispiel, initial_date wenn Sie noch nie diese Spalte in Ihrem Skript verwenden!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top