Diverse impostazioni in my.cnf stanno causando “Lunghezza max chiave è 1000 byte” errore

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

  •  20-09-2019
  •  | 
  •  

Domanda

Edit: Questo potrebbe essere un bug 5.0-specifica. (Sono in 5.0.83). L'annullamento della funzione innodb_log_file_size si libera del problema. Che ha un senso completo. Non.

Googling circa trova una manciata di simile, ma non problemi uguali a 5.0 corretti con patch successivamente.

Con le impostazioni "sbagliate" in my.cnf, questa affermazione creare su MySQL 5.0 mi darà la "chiave specificata era troppo lunga; max lunghezza della chiave è di 1000 byte".

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;

Nel tentativo di migliorare le prestazioni, sono arrivato a my.cnf impostazioni che funzionano bene, ma ottenere la "chiave era troppo lungo" l'errore. Io ho le impostazioni my.cnf in grado di creare questa chiave, ma che svolgono terribilmente sull'importazione dei dati in un diverso, molto grande tavolo.

Le impostazioni che funzionano, ma eseguire male (e che hanno alcuni valori sgargianti dal mio tentativo di comporre diverse impostazioni in):

[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

Le impostazioni che ottengono buoni risultati, ma mi danno l'errore lunghezza della chiave:

[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
È stato utile?

Soluzione

Non credo che il tuo my.cnf ha molto a che fare con questo, ci deve essere qualche altra variabile.

Restrizioni tabelle InnoDB :

  

La lunghezza della chiave massima interna è   3500 byte, ma si limita MySQL   questo a 3072 byte. (1024 byte per   non a 64 bit si basa prima di MySQL 5.0.17,   e per tutti costruisce prima del 5.0.15.)

Noto anche bug 4541 indica un limite di 1000 byte, e che non ci sono piani per aumentare semplicemente questo.

Sul fronte delle prestazioni, grandi indici (e tabelle) come questo sarà davvero molto lento. Io suggerirei di indicizzazione solo il prefisso delle VARCHAR, piuttosto che l'intera stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top