Различные настройки в my.cnf вызывают ошибку «Максимальная длина ключа составляет 1000 байт».

StackOverflow https://stackoverflow.com/questions/1731149

  •  20-09-2019
  •  | 
  •  

Вопрос

Редактировать:Это может быть ошибка, специфичная для версии 5.0.(у меня 5.0.83).Удаление параметра innodb_log_file_size решает проблему.Что имеет полный смысл.Нет.

Погуглив, можно найти несколько похожих, но не идентичных проблем в версии 5.0, которые были исправлены позже.

При «неправильных» настройках в my.cnf этот оператор создания в MySQL 5.0 выдаст мне сообщение «Указанный ключ был слишком длинным;максимальная длина ключа — 1000 байт».

CREATE TABLE ReproduceTheProblem (
COLUMN_ONE varchar(200) character set utf8 default NULL,
COLUMN_TWO varchar(200) character set utf8 default NULL,  
KEY ThisKeyBreaks(COLUMN_ONE, COLUMN_TWO)  
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Пытаясь повысить производительность, я пришел к настройкам my.cnf, которые работают хорошо, но получают ошибку «ключ слишком длинный».У меня есть настройки my.cnf, которые позволяют создать этот ключ, но они ужасно работают при импорте данных в другую, очень большую таблицу.

Настройки, которые работают, но работают плохо (и которые имеют некоторые странные значения из-за моих попыток установить разные настройки):

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-locking
key_buffer_size = 384M
max_allowed_packet = 1024M 
table_cache = 256
max_sp_recursion_depth=255
sort_buffer_size = 2M 
read_buffer_size = 2M 
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 30G
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
max_heap_table_size = 9900000
skip-federated
log-bin=mysql-bin
server-id   = 1

[mysqldump]
quick
max_allowed_packet = 256M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

Настройки, которые работают хорошо, но выдают ошибку длины ключа:

[client]
port            = 3306
socket          = /tmp/mysql.sock

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
max_allowed_packet = 200M
table_cache = 256
query_cache_type = 1
query_cache_limit = 20M
query_cache_size = 500M
long_query_time = 2
thread_cache_size = 1000
thread_concurrency = 4
innodb_thread_concurrency = 4 
old_passwords = 1
max_connections = 1000
max_sp_recursion_depth = 255
server-id       = 0
innodb_buffer_pool_size = 800M
innodb_additional_mem_pool_size = 50M
innodb_log_file_size=50M
innodb_log_buffer_size = 200M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout =50

[mysqldump]
quick
max_allowed_packet = 200M

[mysql]
no-auto-rehash
Это было полезно?

Решение

Я не думаю, что ваш my.cnf имеет к этому какое-то отношение, должна быть какая-то другая переменная.

Из Ограничения на таблицы InnoDB:

Внутренняя максимальная длина ключа составляет 3500 байт, но сам MySQL ограничивает это до 3072 байтов.(1024 байт для не 64-битных сборки до MySQL 5.0.17 и для всех сборки до 5.0.15.)

Я также отмечаю ошибка 4541 указывает ограничение в 1000 байт, и что просто увеличивать его не планируется.

Что касается производительности, такие большие индексы (и таблицы) будут работать очень медленно.Я бы предложил индексировать только префикс varchars, а не всю строку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top