sql >> Databasteknik >  >> RDS >> Mysql

MySQL Query använder inte index i tabelljoin

Som du kan se i EXPLAIN, är "book_id" listad som en möjlig nyckel. Om MySQL inte använder det är det bara det att optimeraren inte tror att det skulle påskynda frågan. Vilket är sant om "book_sales" bara har 2 rader och 100 % av dessa rader delar samma "book_id". Det kallas kardinalitet btw. Hur man undviker tabellsökningar (MySQL-manual)

Prova att fylla den med fler rader och du bör se att MySQL kommer att använda ett index för sammanfogningen.

Redigera:frågan

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

...kommer inte heller att fungera i så fall eftersom optimeraren fortfarande känner igen att läsningen av indexet är suboptimalt och ändrar tabellordningen för att undvika att göra det. Du kan tvinga fram tabellordningen genom att använda STRAIGHT_JOIN . Detta är dock lite av ett hack eftersom det tvingar MySQL att köra frågan på ett sätt som inte är det bästa.

      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


  1. Problem med GROUP_CONCAT och Longtext i MySQL

  2. java.security.AccessControlException:åtkomst nekad (java.security.SecurityPermission authProvider.SunMSCAPI)

  3. PHP &mySQL:När exakt ska man använda htmlentities?

  4. Gruppera efter värde RAND()