Mysql :: Ошибка: указанный ключ был слишком длинный; максимальная длина ключа составляет 1000 байт

script/generate acts_as_taggable_on_migration
rake db:migrate

вызывает

Mysql::Error: Specified key was too long; max key length is 1000 bytes: CREATE  INDEX `index_taggings_on_taggable_id_and_taggable_type_and_context` ON `taggings` (`taggable_id`, `taggable_type`, `context`)

Что мне делать?

Вот моя кодировка базы данных:

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 | 
| character_set_connection | latin1 | 
| character_set_database   | utf8   | 
| character_set_filesystem | binary | 
| character_set_results    | latin1 | 
| character_set_server     | latin1 | 
| character_set_system     | utf8   | 
+--------------------------+--------+
7 rows in set (0.00 sec)
25
задан OMG Ponies 23 May 2011 в 21:32
поделиться

2 ответа

Это исключительно проблема MySQL -

MySQL имеет различные движки - MyISAM, InnoDB, Memory...

MySQL имеет разные ограничения на количество места, которое вы можете использовать для определения индексов на столбцах (колонках) - для MyISAM это 1000 байт; для InnoDB - 767. Тип данных этих столбцов имеет значение - для VARCHAR он равен 3x, поэтому индекс на VARCHAR(100) займет 300 из этих байт (потому что 100 символов * 3 = 300).

Чтобы приспособить индексацию при достижении потолочного значения, можно определить индекс относительно частей типа данных столбца:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

Предположим, что ваш_столбец - это VARCHAR(100), индекс в приведенном выше примере будет только на первых 50 символах. При поиске данных после 50-го символа индекс не будет использоваться.

50
ответ дан 28 November 2019 в 20:38
поделиться

Я думаю, что одно из ваших полей - это varchar с более чем 1000 символов. например контекст?

Подумайте о значении индекса. Это быстрый доступ к строке, когда все ваши проиндексированные поля находятся внутри предложения where. Если индекс слишком длинный (в случае mysql более 1000 байт), нет смысла использовать индекс, потому что он, вероятно, медленнее, чем доступ к полной таблице с полным сканированием таблицы.

Я бы посоветовал сократить индекс, например, до taggable_id и taggable_type, если они оба короче один раз.

Ура - Герхард

0
ответ дан 28 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: