Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL Query tidak menggunakan indeks dalam tabel join

Seperti yang Anda lihat di EXPLAIN, "book_id" terdaftar sebagai kemungkinan kunci. Jika MySQL tidak menggunakannya, hanya saja pengoptimal tidak berpikir itu akan mempercepat kueri. Yang benar jika "book_sales" hanya memiliki 2 baris, dan 100% dari baris tersebut memiliki "book_id" yang sama. Ini disebut kardinalitas btw. Cara Menghindari Pemindaian Tabel (Manual MySQL)

Coba isi dengan lebih banyak baris dan Anda akan melihat bahwa MySQL akan menggunakan indeks untuk bergabung.

Sunting:kueri

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

... tidak akan berfungsi baik dalam kasus itu karena pengoptimal masih mengenali bahwa membaca indeks adalah suboptimal dan mengganti urutan tabel untuk menghindari melakukannya. Anda dapat memaksa urutan tabel dengan menggunakan STRAIGHT_JOIN . Namun, ini sedikit peretasan karena memaksa MySQL untuk mengeksekusi kueri dengan cara yang bukan yang terbaik.

      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. PHP 7.0 dan kesalahan start-up MySQL simbol tidak terdefinisi:mysqlnd_allocator in Unknown

  2. Cara menulis kueri MySQL di mana A berisi ( a atau b )

  3. Membuat Sistem Lisensi

  4. Mencoba Perbarui Rekaman dengan PDO

  5. Cara terbaik untuk membuat file konfigurasi (config.php) php