Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:consulta eficiente em uma coluna muito longa para ser indexada


O problema real é provavelmente usar VARCHAR para a coluna de impressão digital. Ao usar a codificação de caracteres utf8, o MySQL impõe o "pior cenário" e conta 3 bytes por caractere.

Altere isso para codificação de 1 byte (digamos, Latin1) ou use o VARBINARY digite em vez disso:
create table fingerprinted_entry 
( type varchar (128) not null, 
  fingerprint varbinary (512) not null,
  PRIMARY KEY(type, fingerprint)) ENGINE InnoDB; -- no error here

Se você precisar ir além do limite de 767 bytes por prefixo, terá que explicitamente afirme que quando você cria o índice:
create table fingerprinted_entry 
( type varchar (128) not null, 
  fingerprint varbinary (2048) not null,              -- 2048 bytes
  PRIMARY KEY(type, fingerprint(767))) ENGINE InnoDB; -- only the first 767 bytes of fingerprint are stored in the index