sql >> Database >  >> RDS >> Mysql

REGEXP-prestaties (vergelijk met LIKE en =)

Met betrekking tot regexp

De regexp kan nooit gebruik een index in MySQL.
De = zal een index gebruiken als:

  • een index wordt gedeclareerd in de kolom;
  • de waarden in de kolom hebben voldoende kardinaliteit (als meer dan +/- 20% van de rijen overeenkomen, zal MySQL geen index gebruiken, omdat in dat geval een volledige tabelscan sneller is) );
  • Geen andere indexen in dezelfde tabel zijn beter geschikt (MySQL kan slechts één index per tabel per subselectie gebruiken);

Gezien deze en enkele andere, meer esoterische voorbehouden, is een = vergelijking is veel sneller dan een regexp.

Wat betreft like

LIKE kan een index gebruiken als het jokerteken niet het eerste teken is.

SELECT * FROM t WHERE a LIKE 'abc'   <<-- (case insensitive `=`) can use an index
SELECT * FROM t WHERE a LIKE 'abc%'  <<-- can use an index
SELECT * FROM t WHERE a LIKE 'a%'    <<-- can use an index, depending on cardinality
SELECT * FROM t WHERE a LIKE '%a%'   <<-- cannot use an index
SELECT * FROM t WHERE a LIKE '_agf'  <<-- cannot use an index

De prestaties van like bij gebruik van een index ligt deze zeer dicht bij = (ervan uitgaande dat hetzelfde aantal rijen wordt geretourneerd).



  1. Hoe een externe sleutel in SQLite te laten vallen

  2. Hoe trek ik het gebruik van SQL in MYSQL af tussen twee datum-tijdwaarden en haal ik het resultaat in minuten of seconden op?

  3. Kan geen verbinding maken met een van de opgegeven MySQL-hosts bij het controleren van de verbinding

  4. Gegroepeerde tekenreeksaggregatie / LISTAGG voor SQL Server