Jak mówi @Devart, całkowita długość Twojego indeksu jest zbyt długa.
Krótka odpowiedź brzmi, że i tak nie powinieneś indeksować tak długich kolumn VARCHAR, ponieważ indeks będzie bardzo obszerny i nieefektywny.
Najlepszą praktyką jest użycie indeksów prefiksów więc indeksujesz tylko lewy podciąg danych. Większość twoich danych i tak będzie krótsza niż 255 znaków.
Podczas definiowania indeksu można zadeklarować długość prefiksu na kolumnę. Na przykład:
...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...
Ale jaka jest najlepsza długość prefiksu dla danej kolumny? Oto metoda, aby się tego dowiedzieć:
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`;
Informuje o proporcji wierszy, które mają nie więcej niż podaną długość ciągu w menu_link
kolumna. Możesz zobaczyć dane wyjściowe w następujący sposób:
+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
| 21.78 | 80.20 | 100.00 | 100.00 |
+---------------+---------------+---------------+----------------+
To mówi ci, że 80% twoich ciągów ma mniej niż 20 znaków, a wszystkie twoje ciągi mają mniej niż 50 znaków. Nie ma więc potrzeby indeksowania więcej niż prefiks o długości 50, a już na pewno nie ma potrzeby indeksowania pełnej długości 255 znaków.
PS:INT(1)
i INT(32)
typy danych wskazują na kolejne nieporozumienie dotyczące MySQL. Argument numeryczny nie ma wpływu na przechowywanie lub zakres wartości dozwolonych dla kolumny. INT
ma zawsze 4 bajty i zawsze dopuszcza wartości od -2147483648 do 2147483647. Argument numeryczny dotyczy wypełniania wartości podczas wyświetlania, co nie ma żadnego efektu, chyba że użyjesz ZEROFILL
opcja.