Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL Query nie używa indeksu w łączeniu tabel

Jak widać w wyjaśnieniu, „book_id” jest wymieniony jako możliwy klucz. Jeśli MySQL z niego nie korzysta, oznacza to, że optymalizator nie sądzi, że przyspieszyłoby to zapytanie. Co jest prawdą, jeśli „book_sales” ma tylko 2 wiersze, a 100% tych wierszy ma ten sam „book_id”. To się nazywa kardynalność btw. Jak uniknąć skanowania tabel (Podręcznik MySQL)

Spróbuj wypełnić go większą liczbą wierszy, a powinieneś zobaczyć, że MySQL użyje indeksu do łączenia.

Edycja:zapytanie

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

... w takim przypadku również nie zadziała, ponieważ optymalizator nadal rozpoznaje, że odczyt indeksu jest nieoptymalny i zmienia kolejność tabel, aby tego uniknąć. Możesz wymusić kolejność tabel, używając STRAIGHT_JOIN . Jest to jednak trochę hack, ponieważ zmusza MySQL do wykonania zapytania w sposób, który nie jest najlepszy.

      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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak porównywać wydajność Moodle?

  2. LOAD DATA LOCAL INFILE nie działa z php 5.5 przy użyciu PDO

  3. Zapisz GeoDataFrame w bazie danych SQL

  4. MySQL:wybierz datę w poniedziałek w bieżącym tygodniu

  5. Jak stworzyć bezserwerowe API GraphQL dla MySQL, Postgres i Aurora?