Rumah >pangkalan data >tutorial mysql >Mengapa Saya Mendapat Ralat MySQL 'Kunci Yang Ditentukan Terlalu Panjang'?

Mengapa Saya Mendapat Ralat MySQL 'Kunci Yang Ditentukan Terlalu Panjang'?

Susan Sarandon
Susan Sarandonasal
2024-12-09 12:24:15168semak imbas

Why Am I Getting the MySQL Error

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn