Semasa meneroka isu prestasi pertanyaan SQL, pengguna cuba mengoptimumkan pertanyaan dengan menambahkan indeks pada lajur products.name, iaitu ditakrifkan sebagai varchar(512). Indeks asal, yang dinyatakan sebagai product_name_idx (name(512)), mengakibatkan indeks tidak digunakan untuk mengisih, kerana ia dikenal pasti sebagai indeks awalan.
Untuk menangani masalah ini, pengguna cuba memotong lajur nama kepada varchar(255). Berikutan perubahan ini, pernyataan EXPLAIN yang berikutnya menunjukkan bahawa indeks sedang digunakan.
Tingkah laku ini berpunca daripada andaian yang dibuat oleh MySQL mengenai panjang aksara UTF-8. Dalam MySQL, saiz indeks maksimum untuk satu lajur ialah 767 bait. Sebelum MySQL 8.0, set aksara utf8 dihadkan kepada maksimum 3 bait setiap aksara. Walau bagaimanapun, dengan MySQL 8.0, ini telah berubah dan utf8mb3 kini ditamatkan dan digantikan dengan utf8mb4, yang menyokong sehingga 4 bait setiap aksara.
Dalam versi MySQL sebelum 8.0, menyatakan panjang indeks lebih besar daripada lalai daripada 255 aksara untuk lajur varchar(255) akan mengakibatkan ralat. Ini kerana MySQL menganggap 3 bait setiap aksara untuk UTF-8, dan indeks 256 aksara akan melebihi had 767 bait.
Dengan MySQL 8.0 dan set aksara utf8mb4, andaian 3 bait bagi setiap aksara masih terpakai . Walau bagaimanapun, dengan pengenalan format baris mampat dan dinamik, awalan kunci indeks boleh mencapai sehingga 3072 bait. Akibatnya, indeks boleh dibuat pada lajur varchar dengan bilangan aksara yang lebih besar.
Untuk meringkaskan, dalam versi MySQL terdahulu, had panjang indeks untuk lajur varchar ialah 255 aksara kerana andaian 3 bait setiap aksara UTF-8 dan saiz indeks maksimum 767 bait. Dengan MySQL 8.0 dan utf8mb4, had ini telah dilonggarkan untuk format baris yang dimampatkan dan dinamik, membolehkan indeks yang lebih panjang pada lajur varchar.
Atas ialah kandungan terperinci Mengapa Had Panjang Indeks varchar MySQL Berbeza Antara Versi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!