sql >> Database teknologi >  >> RDS >> Mysql

#1071 - Den angivne nøgle var for lang; max nøglelængde er 1000 bytes

Som @Devart siger, er den samlede længde af dit indeks for lang.

Det korte svar er, at du alligevel ikke bør indeksere så lange VARCHAR-kolonner, fordi indekset vil være meget omfangsrigt og ineffektivt.

Den bedste praksis er at bruge præfiksindekser så du indekserer kun en venstre understreng af dataene. De fleste af dine data vil alligevel være meget kortere end 255 tegn.

Du kan angive en præfikslængde pr. kolonne, når du definerer indekset. For eksempel:

...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...
 

Men hvad er den bedste præfikslængde for en given kolonne? Her er en metode til at finde ud af:

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`;
 

Den fortæller dig andelen af ​​rækker, der ikke har mere end en given strenglængde i menu_link kolonne. Du kan muligvis se output som dette:

+---------------+---------------+---------------+----------------+ | pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 | +---------------+---------------+---------------+----------------+ | 21.78 | 80.20 | 100.00 | 100.00 | +---------------+---------------+---------------+----------------+

Dette fortæller dig, at 80 % af dine strenge er mindre end 20 tegn, og alle dine strenge er mindre end 50 tegn. Så der er ingen grund til at indeksere mere end en præfikslængde på 50, og bestemt ingen grund til at indeksere den fulde længde på 255 tegn.

PS:INT(1) og INT(32) datatyper indikerer en anden misforståelse om MySQL. Det numeriske argument har ingen effekt relateret til lagring eller intervallet af værdier, der er tilladt for kolonnen. INT er altid 4 bytes, og det tillader altid værdier fra -2147483648 til 2147483647. Det numeriske argument handler om udfyldning af værdier under visning, hvilket ikke har nogen effekt, medmindre du bruger ZEROFILL mulighed.



  1. sql server vælg første række fra en gruppe

  2. MySQL UNION-klausul

  3. Hvad er den mest anbefalede måde at gemme tid i PostgreSQL ved hjælp af Java?

  4. SQLPlus - spooling til flere filer fra PL/SQL-blokke