Rumah >pangkalan data >tutorial mysql >Mengapa Saya Mendapat Ralat MySQL 'Kunci Yang Ditentukan Terlalu Panjang'?
Ralat MySql: "Kunci Yang Ditentukan Terlalu Panjang"
Dalam menanyakan pangkalan data MySql, ralat "Kunci yang ditentukan terlalu panjang" boleh timbul apabila membuat jadual dengan panjang kunci yang panjang. Isu ini sering berlaku apabila menggunakan berbilang lajur dalam satu indeks.
Kajian Kes dengan Jadual pds_core_menu_items
Pertanyaan yang disediakan cuba mencipta jadual dengan indeks komposit pada lajur parent_menu_id, menu_link, pemalam dan alias. Lajur ini ialah jenis data VARCHAR(255).
Penjelasan Isu
Seperti yang @Devart nyatakan, panjang gabungan lajur ini melebihi panjang kunci maksimum yang dibenarkan 1000 bait. Disebabkan oleh sekatan ini, penciptaan indeks gagal dengan ralat yang ditentukan.
Penyelesaian: Pengindeksan Awalan
Amalan terbaik untuk menangani isu ini melibatkan penggunaan pengindeksan awalan. Dengan menggunakan indeks awalan, hanya subrentetan kiri data asal diindeks, mengurangkan saiz indeks dengan ketara dan meningkatkan kecekapan.
Menentukan Panjang Awalan Optimum
Untuk menentukan panjang awalan yang optimum untuk setiap lajur, laksanakan yang berikut pertanyaan:
SELECT ROUND(SUM(LENGTH(`column_name`)<10)*100/COUNT(`column_name`),2) AS pct_length_10, ROUND(SUM(LENGTH(`column_name`)<20)*100/COUNT(`column_name`),2) AS pct_length_20, ROUND(SUM(LENGTH(`column_name`)<50)*100/COUNT(`column_name`),2) AS pct_length_50, ROUND(SUM(LENGTH(`column_name`)<100)*100/COUNT(`column_name`),2) AS pct_length_100 FROM `table_name`;
Ganti column_name dengan lajur yang sedang dianalisis dan table_name dengan jadual yang mengandungi lajur. Analisis output untuk mengenal pasti panjang subrentetan terkecil yang meliputi peratusan baris tertinggi.
Pertanyaan Kemas Kini
Dalam contoh yang disediakan, mengindeks subrentetan sebanyak 50 aksara sudah memadai , seperti yang ditunjukkan oleh hasil pertanyaan. Berikut ialah pertanyaan yang dikemas kini:
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
Nota Tambahan
Ralat juga boleh berlaku apabila menggunakan jenis data INT(1) dan INT(32). Walaupun jenis data ini tidak mempunyai kesan pada saiz storan atau julat nilai, ia mungkin mempengaruhi cara nilai dipaparkan jika pilihan ZEROFILL digunakan.
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat MySQL 'Kunci Yang Ditentukan Terlalu Panjang'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!