Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Effiziente Abfrage einer Spalte, die zu lang ist, um indiziert zu werden

Das eigentliche Problem ist wahrscheinlich die Verwendung von VARCHAR für die Fingerabdruckspalte. Bei Verwendung der utf8-Zeichenkodierung erzwingt MySQL das „Worst-Case-Szenario“ und zählt 3 Bytes pro Zeichen.

Ändern Sie dies entweder in eine 1-Byte-Codierung (z. B. Latin1) oder verwenden Sie VARBINARY geben Sie stattdessen ein:

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

Wenn Sie die 767-Byte-Grenze pro Präfix überschreiten müssen, müssen Sie dies explizit tun Geben Sie Folgendes an, wenn Sie den Index erstellen:

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