Ini karena apa yang saya sebut aturan 5% berdasarkan populasi kunci (kardinalitas tupel).
Jika Anda mengindeks tabel yang memiliki kardinalitas miring, Pengoptimal Kueri MySQL akan selalu memilih jalur dengan resistensi paling rendah.
CONTOH :Jika sebuah tabel memiliki kolom gender, kardinalitasnya adalah dua, M dan F.
Apa yang Anda indeks seperti kolom gender ??? Anda pada dasarnya mendapatkan dua daftar tertaut raksasa.
Jika Anda memuat satu juta baris ke dalam tabel dengan kolom jenis kelamin, Anda mungkin mendapatkan 50% M dan 50% F.
Sebuah indeks dianggap tidak berguna selama pengoptimalan kueri jika kardinalitas kombo kunci (populasi kunci seperti yang saya ungkapkan) lebih dari 5% dari total jumlah tabel.
Sekarang, sehubungan dengan contoh Anda, mengapa keduanya JELASKAN rencana yang berbeda ??? Dugaan saya adalah MySQL Query Optimizer dan InnoDB sebagai tim tag.
Pada CREATE TABLE pertama, tabel dan indeks berukuran hampir sama meskipun kecil, jadi diputuskan mendukung indeks dengan melakukan pemindaian indeks, bukan pemindaian tabel penuh . Ingatlah bahwa indeks non-unik membawa kunci utama internal (RowID) setiap baris dalam entri indeksnya, sehingga membuat indeks hampir berukuran sama dengan tabel itu sendiri.
Di CREATE TABLE kedua, karena pengenalan kolom lain, pengguna, Anda sekarang membuat Pengoptimal Kueri melihat skenario yang sama sekali berbeda:Tabel sekarang lebih besar dari indeks . Oleh karena itu, Pengoptimal Kueri menjadi lebih ketat dalam interpretasinya tentang cara menggunakan indeks yang tersedia. Itu pergi ke aturan 5% yang saya sebutkan sebelumnya. Aturan itu gagal total dan Pengoptimal Kueri memutuskan mendukung pemindaian tabel penuh.