Question

J'ai un système qui est similaire à la Q & A caractéristique de stackoverflow. La principale différence est chapeau chaque question a une datetime d'expiration:

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)
) 

Je veux afficher une question en même temps que le haut N réponses non expirés ordonné par le score. Je pense quelque chose comme ceci:

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

Quelques questions:

1) La requête ci-dessus la façon la plus efficace de faire ce que je veux? Comment est-il différent d'utiliser explicitement REJOIGNEZ tels que:

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) Comment faire mon index d'utilisation de requêtes? Je pense ajouter cet index des réponses TABLE:

INDEX (question_id, expiration_datetime, score)

Est-ce que le travail d'index ci-dessus pour ma requête? Il ne semble pas juste parce expiration_datetime est ascendant alors que j'ai besoin marquer d'être décroissant. Que puis-je faire ici?

Était-ce utile?

La solution

Jointure de tables avec INNER JOIN ou dans la clause FROM donne le même plan d'exécution. Cependant, le premier est beaucoup plus facile à lire (et c'est ce standard suggèrent que depuis 1992).

Vos SGBDR utiliseront un index chaque fois qu'il est possible. Il est généralement une bonne idée d'imprimer le plan d'exécution (EXPLAIN SELECT * FROM -- ...). Toutefois, notez que la création d'index plusieurs colonnes peut être difficile. Dans votre cas, vous pouvez utiliser l'index sur question_id mais pas sur expiration_datetime ou le score parce qu'ils ne sont pas les premières colonnes de l'index. Vous auriez à faire trois index différents.

P.S. SELECT * n'est pas recommandé. Tapez toujours les colonnes dont vous avez besoin (facile à lire et re-lecture) et ne citer que les colonnes que vous utiliserez. Aucun point pour sélectionner, par exemple, initial_date si vous n'utilisez cette colonne dans votre script!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top