sql >> Database >  >> RDS >> Mysql

MySQL:efficiënte query op een kolom die te lang is om geïndexeerd te worden

Het echte probleem is waarschijnlijk om VARCHAR . te gebruiken voor de vingerafdrukkolom. Bij gebruik van de utf8-tekencodering, dwingt MySQL het "worst case scenario" af en telt 3 bytes per teken.

Verander dat in 1-byte codering (zeg Latin1), of gebruik de VARBINARY typ in plaats daarvan:

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

Als u de limiet van 767 bytes per voorvoegsel moet overschrijden, moet u expliciet vermeld dat wanneer u de index maakt:

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. Hoe de korte maandnaam van een datum in MySQL te krijgen

  2. Hoe de waarde SQL_CALC_FOUND_ROWS te krijgen met behulp van voorbereide instructies?

  3. PDO “Uncaught exception 'PDOException' .. Kan geen query's uitvoeren terwijl andere niet-gebufferde query's actief zijn. Overweeg het gebruik van PDOStatement::fetchAll().”

  4. C#:Object kan niet van DbNull naar andere typen worden gecast