Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Query non utilizza l'indice nel join della tabella

Come puoi vedere in EXPLAIN, "book_id" è elencato come una possibile chiave. Se MySQL non lo usa, è solo che l'ottimizzatore non pensa che accelererebbe la query. Il che è vero se "book_sales" ha solo 2 righe e il 100% di quelle righe condivide lo stesso "book_id". Si chiama cardinalità tra l'altro. Come evitare le scansioni delle tabelle (Manuale MySQL)

Prova a riempirlo con più righe e dovresti vedere che MySQL utilizzerà un indice per il join.

Modifica:la query

SELECT sale_amount, price
FROM books, book_sales
FORCE INDEX ( book_id ) 
WHERE book_sales.book_id = books.book_id
AND books.author_id =1

...non funzionerà neanche in quel caso perché l'ottimizzatore riconosce comunque che la lettura dell'indice non è ottimale e cambia l'ordine della tabella per evitare di farlo. Puoi forzare l'ordine della tabella utilizzando STRAIGHT_JOIN . Questo è, tuttavia, un po' un trucco perché costringe MySQL a eseguire la query in un modo che non è il migliore.

      EXPLAIN
       SELECT sale_amount, price
         FROM books
STRAIGHT_JOIN book_sales FORCE INDEX (book_id) ON book_sales.book_id = books.book_id
        WHERE books.author_id = 1