sql >> Database >  >> RDS >> Mysql

MySQL Query gebruikt geen index in table join

Zoals je kunt zien in de EXPLAIN, wordt "book_id" vermeld als een mogelijke sleutel. Als MySQL het niet gebruikt, denkt de optimizer alleen dat het de zoekopdracht niet zou versnellen. Wat waar is als "book_sales" slechts 2 rijen heeft en 100% van die rijen dezelfde "book_id" delen. Het heet kardinaliteit btw. Tabelscans vermijden (MySQL-handleiding)

Probeer het te vullen met meer rijen en je zou moeten zien dat MySQL een index zal gebruiken voor de join.

Bewerken:de vraag

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

... zal in dat geval ook niet werken omdat de optimizer nog steeds herkent dat het lezen van de index suboptimaal is en de tabelvolgorde verandert om dit te voorkomen. U kunt de tafelvolgorde forceren door STRAIGHT_JOIN te gebruiken . Dit is echter een beetje een hack omdat het MySQL dwingt om de query uit te voeren op een manier die niet de beste is.

      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. SQL Server Update Trigger, Alleen gewijzigde velden ophalen

  2. Werken met PostgreSQL-databases

  3. Waarom maakt postgres de database niet?

  4. Tijdbesparende methode nodig om grote CSV-bestanden via PHP in meerdere MySQL-tabellen te importeren