Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Query não usa índice na junção da tabela


Como você pode ver no EXPLAIN, "book_id" está listado como uma possível chave. Se o MySQL não usa, é só que o otimizador não acha que isso aceleraria a consulta. O que é verdade se "book_sales" tiver apenas 2 linhas e 100% dessas linhas compartilharem o mesmo "book_id". É chamado de cardinalidade btw. Como evitar verificações de tabela (Manual MySQL)

Tente preenchê-lo com mais linhas e você verá que o MySQL usará um índice para a junção.

Editar:a 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

... também não funcionará nesse caso porque o otimizador ainda reconhece que a leitura do índice está abaixo do ideal e alterna a ordem da tabela para evitar isso. Você pode forçar a ordem da tabela usando STRAIGHT_JOIN . Isso é, no entanto, um pouco complicado porque força o MySQL a executar a consulta de uma maneira que não é a melhor.
      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