sql >> Base de Datos >  >> RDS >> Mysql

MySQL:consulta eficiente en una columna demasiado larga para ser indexada

El problema real es probablemente usar VARCHAR para la columna de huellas dactilares. Cuando se usa la codificación de caracteres utf8, MySQL impone el "peor de los casos" y cuenta 3 bytes por carácter.

Cambie eso a codificación de 1 byte (digamos Latin1), o use VARBINARY escriba en su lugar:

create table fingerprinted_entry 
( type varchar (128) not null, 
  fingerprint varbinary (512) not null,
  PRIMARY KEY(type, fingerprint)) ENGINE InnoDB; -- no error here

Si tiene que ir más allá del límite de 767 bytes por prefijo, tendrá que explícitamente indique que cuando cree el í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