Mysql
 sql >> Baza danych >  >> RDS >> Mysql

#1071 — Określony klucz był za długi; maksymalna długość klucza to 1000 bajtów

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Eksportuj bazę danych MySQL lub MariaDB

  2. Uzyskiwanie pierwszego dnia tygodnia w MySql za pomocą Week No

  3. Jak stworzyć bazę danych w MySQL

  4. Przykłady ORD() – MySQL

  5. oblicz sumę czasu na wpisywanie za pomocą sql