Seperti yang dikatakan @Devart, panjang total indeks Anda terlalu panjang.
Jawaban singkatnya adalah Anda tidak boleh mengindeks kolom VARCHAR yang begitu panjang, karena indeksnya akan sangat besar dan tidak efisien.
Praktik terbaik adalah menggunakan indeks awalan jadi Anda hanya mengindeks substring kiri data. Sebagian besar data Anda akan jauh lebih pendek dari 255 karakter.
Anda dapat mendeklarasikan panjang awalan per kolom saat Anda menentukan indeks. Misalnya:
...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...
Tapi berapa panjang awalan terbaik untuk kolom tertentu? Berikut cara untuk mengetahuinya:
SELECT
ROUND(SUM(LENGTH(`menu_link`)<10)*100/COUNT(`menu_link`),2) AS pct_length_10,
ROUND(SUM(LENGTH(`menu_link`)<20)*100/COUNT(`menu_link`),2) AS pct_length_20,
ROUND(SUM(LENGTH(`menu_link`)<50)*100/COUNT(`menu_link`),2) AS pct_length_50,
ROUND(SUM(LENGTH(`menu_link`)<100)*100/COUNT(`menu_link`),2) AS pct_length_100
FROM `pds_core_menu_items`;
Ini memberi tahu Anda proporsi baris yang tidak lebih dari panjang string tertentu di menu_link
kolom. Anda mungkin melihat output seperti ini:
+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
| 21.78 | 80.20 | 100.00 | 100.00 |
+---------------+---------------+---------------+----------------+
Ini memberi tahu Anda bahwa 80% string Anda kurang dari 20 karakter, dan semua string Anda kurang dari 50 karakter. Jadi tidak perlu mengindeks lebih dari panjang awalan 50, dan tentu saja tidak perlu mengindeks panjang penuh 255 karakter.
PS:INT(1)
dan INT(32)
tipe data menunjukkan kesalahpahaman lain tentang MySQL. Argumen numerik tidak berpengaruh terkait penyimpanan atau rentang nilai yang diizinkan untuk kolom. INT
selalu 4 byte, dan selalu memungkinkan nilai dari -2147483648 hingga 2147483647. Argumen numerik adalah tentang mengisi nilai selama tampilan, yang tidak berpengaruh kecuali Anda menggunakan ZEROFILL
pilihan.