sql >> Database teknologi >  >> RDS >> Mysql

REGEXP ydeevne (sammenlign med LIKE og =)

Angående regexp

Det regexp kan aldrig brug et indeks i MySQL.
= vil bruge et indeks, hvis:

  • et indeks er erklæret på kolonnen;
  • værdierne i kolonnen har tilstrækkelig kardinalitet (hvis mere end +/- 20 % af rækkerne matcher, vil MySQL ikke bruge et indeks, fordi det i så fald er hurtigere at foretage en fuld tabelscanning );
  • Ingen andre indekser på samme tabel er bedre egnede (MySQL kan kun bruge ét indeks pr. tabel pr. undervalg);

I betragtning af disse og nogle andre mere esoteriske forbehold er en = sammenligning er meget hurtigere end et regexp.

Angående lignende

LIKE kan bruge et indeks, hvis jokertegnet ikke er det første tegn.

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

Ydeevnen for like når du bruger et indeks er meget tæt på = (forudsat det samme antal returnerede rækker).



  1. Mysql, omform data fra lang / høj til bred

  2. MySQL:SUM() med JOIN returnerer forkerte værdier

  3. Sådan får du alle data fra 2 tabeller ved hjælp af fremmednøgle

  4. Kan jeg genbruge et beregnet felt i en SELECT-forespørgsel?