Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :requête efficace sur une colonne trop longue pour être indexée

Le vrai problème est probablement d'utiliser VARCHAR pour la colonne des empreintes digitales. Lors de l'utilisation de l'encodage de caractères utf8, MySQL applique le "pire scénario" et compte 3 octets par caractère.

Changez cela en codage à 1 octet (par exemple Latin1), ou utilisez le VARBINARY tapez plutôt :

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

Si vous devez dépasser la limite de 767 octets par préfixe, vous devrez explicitement indiquez que lorsque vous créez l'index :

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