Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:query efficiente su una colonna troppo lunga per essere indicizzata

Il vero problema è probabilmente usare VARCHAR per la colonna dell'impronta digitale. Quando si utilizza la codifica dei caratteri utf8, MySQL applica lo "scenario peggiore" e conta 3 byte per carattere.

Cambialo in codifica a 1 byte (diciamo Latin1) o usa il VARBINARY digita invece:

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

Se devi superare il limite di 767 byte per prefisso, dovrai esplicitamente dichiaralo quando crei l'indice:

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