sql >> Base de Datos >  >> RDS >> Mysql

MySQL Query no usa el índice en la combinación de tablas

Como puede ver en EXPLAIN, "book_id" aparece como una posible clave. Si MySQL no lo usa, es solo que el optimizador no cree que aceleraría la consulta. Lo cual es cierto si "book_sales" solo tiene 2 filas, y el 100% de esas filas comparten el mismo "book_id". Se llama cardinalidad por cierto. Cómo evitar los escaneos de tablas (Manual MySQL)

Intente llenarlo con más filas y debería ver que MySQL usará un índice para la unión.

Editar:la consulta

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

... tampoco funcionará en ese caso porque el optimizador aún reconoce que la lectura del índice es subóptima y cambia el orden de la tabla para evitarlo. Puede forzar el orden de la tabla usando STRAIGHT_JOIN . Sin embargo, esto es un truco porque obliga a MySQL a ejecutar la consulta de una manera que no es la mejor.

      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