Mysql
 sql >> база данни >  >> RDS >> Mysql

#1071 - Посоченият ключ беше твърде дълъг; максималната дължина на ключа е 1000 байта

Както казва @Devart, общата дължина на вашия индекс е твърде дълга.

Краткият отговор е, че така или иначе не трябва да индексирате толкова дълги VARCHAR колони, защото индексът ще бъде много обемист и неефективен.

Най-добрата практика е да използвате префиксни индекси така че индексирате само ляв подниз от данните. Повечето от вашите данни така или иначе ще бъдат много по-къси от 255 знака.

Можете да декларирате дължина на префикса за колона, докато дефинирате индекса. Например:

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

Но каква е най-добрата дължина на префикса за дадена колона? Ето метод да разберете:

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

Той ви казва дела на редовете, които нямат повече от дадена дължина на низа в menu_link колона. Може да видите изход като този:

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

Това ви казва, че 80% от низовете ви са по-малко от 20 знака и всичките ви низове са по-малко от 50 знака. Така че няма нужда да индексирате повече от дължина на префикса от 50 и със сигурност няма нужда да индексирате цялата дължина от 255 знака.

PS:INT(1) и INT(32) типове данни показва друго недоразумение относно MySQL. Числовият аргумент няма ефект, свързан със съхранението или диапазона от стойности, разрешени за колоната. INT винаги е 4 байта и винаги позволява стойности от -2147483648 до 2147483647. Числовият аргумент е за допълване на стойности по време на показване, което няма ефект, освен ако не използвате ZEROFILL опция.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да видя какъв набор от символи представлява MySQL база данни/таблица/колона?

  2. Как трябва да съхранявам GUID в MySQL таблици?

  3. Как да импортирате и експортирате база данни чрез phpMyAdmin (грешка „Отказан достъп при създаване на база данни db_name“)

  4. MySQL Сравнете бази данни

  5. MySQL:Достъпът е отказан за потребител 'test'@'localhost' (използвайки парола:ДА) с изключение на root потребител