Di InnoDB, indeks sekunder apa pun secara internal berisi kolom kunci utama tabel. Jadi indeks nama pada kolom (nama) secara implisit pada kolom (nama, id).
Ini berarti bahwa EXPLAIN menunjukkan akses Anda ke tabel kategori sebagai "index-scan" (ini ditunjukkan dalam type kolom sebagai "indeks"). Dengan memindai indeks, ia juga memiliki akses ke kolom id, yang digunakan untuk mencari baris di tabel kedua, item.
Kemudian ia juga memanfaatkan indeks item pada (category_id) yang benar-benar (category_id, id), dan ia dapat mengambil item.id untuk daftar-pilihan Anda hanya dengan membaca indeks. Tidak perlu membaca tabel sama sekali (ini ditampilkan di Ekstra kolom sebagai "Menggunakan indeks").
MyISAM tidak menyimpan kunci utama dengan kunci sekunder dengan cara ini, sehingga tidak bisa mendapatkan optimasi yang sama. Akses ke tabel kategori adalah ketik "ALL" yang berarti tabel-scan.
Saya berharap akses ke item tabel MyISAM akan menjadi "ref" karena mencari baris menggunakan indeks pada (category_id). Tetapi pengoptimal mungkin mendapatkan hasil yang miring jika Anda memiliki sangat sedikit baris dalam tabel, atau jika Anda belum melakukan ANALYZE TABLE item
sejak membuat indeks.
Kembalikan pembaruan Anda:
Sepertinya pengoptimal lebih memilih pemindaian indeks daripada pemindaian tabel, sehingga dibutuhkan kesempatan untuk melakukan pemindaian indeks di InnoDB, dan menempatkan tabel kategori terlebih dahulu. Pengoptimal memutuskan untuk mengurutkan ulang tabel daripada menggunakan tabel dalam urutan yang Anda berikan dalam kueri Anda.
Di tabel MyISAM, akan ada satu tabel-scan tabel mana saja yang dipilih untuk diakses terlebih dahulu, tetapi dengan meletakkan tabel kategori kedua, ia bergabung dengan indeks kunci PRIMARY kategori alih-alih indeks sekunder item. Pengoptimal lebih memilih pencarian daripada kunci unik atau kunci utama (ketik "eq_ref").