Domanda

Ho un sistema che è simile a quello di Q & A di StackOverflow. La differenza principale è il cappello ogni domanda ha un datetime scadenza:

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

Voglio visualizzare una domanda insieme con la parte superiore N risposte non scaduto ordinata in base al punteggio. Sto pensando qualcosa di simile:

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

Alcune domande:

1) Se la query sopra il modo più efficace per fare quello che voglio? Come è diverso dal modo esplicito utilizzando ENTRA come ad esempio:

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) Come fare il mio indice di utilizzo di query? Sto pensando di aggiungere questo indice per le risposte TABELLA:

INDEX (question_id, expiration_datetime, score)

Sarebbe il lavoro di indice sopra per la mia domanda? Non sembra giusto, perché expiration_datetime sta ascendendo mentre ho bisogno segnare per essere discendente. Cosa posso fare qui?

È stato utile?

Soluzione

tavoli unendosi con INNER JOIN o nella clausola FROM dà lo stesso piano di esecuzione. Tuttavia, il primo è molto più facile da leggere (e questo è quello standard di suggerire a partire dal 1992).

I tuoi RDBMS utilizzeranno un indice ogni volta che è possibile. Di solito è una buona idea di stampare il piano di esecuzione (EXPLAIN SELECT * FROM -- ...). Si noti tuttavia che la creazione di indice più colonne può essere difficile. Nel tuo caso, è possibile utilizzare l'indice su question_id ma non sul expiration_datetime o punteggio perché non sono le prime colonne dell'indice. Si dovrebbe fare tre diverso indice.

P.S. SELECT * non è consigliata. digitare sempre le colonne è necessario (facile da leggere e rileggere) e menziona solo le colonne che si intende utilizzare. Nessun punto per selezionare, per esempio, initial_date se non si utilizza mai questa colonna nello script!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top