sql >> Databáze >  >> RDS >> Mysql

MySQL Query nepoužívá index ve spojení tabulky

Jak můžete vidět ve VYSVĚTLENÍ, "book_id" je uveden jako možný klíč. Pokud to MySQL nepoužívá, tak si optimalizátor nemyslí, že by to urychlilo dotaz. Což je pravda, pokud má „prodej_knihy“ pouze 2 řádky a 100 % těchto řádků sdílí stejné „id_knihy“. Btw tomu se říká kardinalita. Jak se vyhnout skenování tabulek (Manuál MySQL)

Zkuste jej vyplnit více řádky a měli byste vidět, že MySQL použije index pro spojení.

Upravit:dotaz

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

...nebude fungovat ani v tomto případě, protože optimalizátor stále rozpoznává, že čtení indexu není optimální, a přepne pořadí tabulek, aby tomu zabránil. Pořadí stolu můžete vynutit pomocí STRAIGHT_JOIN . To je však trochu hack, protože to nutí MySQL provést dotaz způsobem, který není nejlepší.

      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. CRUD pro MySQL a PHP

  2. Datové modely

  3. Jak bezpečné je vlákno EnableWriteAheadLogging v kontextu skutečného použití a dokumentace SQLite?

  4. Jak vypsat aktivní / otevřená připojení v Oracle?