sql >> Databasteknik >  >> RDS >> Mysql

MySQL:effektiv fråga på en kolumn som är för lång för att indexeras

Det verkliga problemet är förmodligen att använda VARCHAR för fingeravtryckskolumnen. När du använder utf8-teckenkodningen upprätthåller MySQL "värsta scenariot" och räknar 3 byte per tecken.

Ändra det till 1-byte-kodning (säg Latin1) eller använd VARBINARY skriv istället:

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

Om du måste överskrida gränsen på 767 byte per prefix, måste du explicit ange att när du skapar indexet:

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


  1. Varför skalas NoSql-databaser bättre än relationsdatabaser? Hur ska jag välja mellan dem?

  2. Testa en Entity Framework-databasanslutning

  3. Skicka värden som läses från en fil som indata till en SQL-fråga i Oracle

  4. Design för att representera anställdas in- och utcheckning