Diferentes configurações no meu.cnf estão causando o erro "Comprimento da chave máxima é de 1000 bytes"

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

  •  20-09-2019
  •  | 
  •  

Pergunta

EDIT: Este pode ser um bug específico de 5.0. (Estou no 5.0.83). A remoção da configuração innodb_log_file_size se livra do problema. O que faz sentido completo. Não.

Pesquisando no Google sobre descobertas de um punhado de problemas semelhantes, mas não idênticos, em 5.0 que foram corrigidos posteriormente.

Com as configurações "erradas" no meu.cnf, essa instrução CREATE no MySQL 5.0 me dará a "chave especificada foi muito longa; o comprimento da chave máxima é de 1000 bytes".

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;

Ao tentar melhorar o desempenho, cheguei às configurações do My.CNF que têm um bom desempenho, mas obtenha o erro "Key foi muito longo". Eu tenho as configurações do My.CNF que podem criar essa chave, mas que têm um desempenho terrivelmente na importação de dados para uma tabela diferente e muito grande.

As configurações que funcionam, mas realizam mal (e que têm alguns valores acrescentados da minha tentativa de discar diferentes configurações):

[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

As configurações que têm um bom desempenho, mas me dão o erro de comprimento da chave:

[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
Foi útil?

Solução

Eu não acho que você tenha muito a ver com isso, deve haver outra variável.

De Restrições em tabelas innodb:

O comprimento máximo interno da chave é de 3500 bytes, mas o próprio MySQL restringe isso a 3072 bytes. (1024 bytes para compilações não 64 bits antes do MySQL 5.0.17 e para todas as construções antes de 5.0.15.)

Eu também noto Bug 4541 indica um limite de 1000 bytes e que não há planos para simplesmente aumentar isso.

Na frente do desempenho, grandes índices (e tabelas) como esse serão muito lentos. Eu sugeriria indexar apenas o prefixo dos varchars em vez de toda a string.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top