sql >> Databasteknik >  >> RDS >> Mysql

REGEXP-prestanda (jämför med LIKE och =)

Angående regexp

Regexp kan aldrig använd ett index i MySQL.
= kommer att använda ett index om:

  • ett index deklareras i kolumnen;
  • värdena i kolumnen har tillräcklig kardinalitet (om mer än +/- 20 % av raderna matchar kommer MySQL inte att använda ett index, eftersom det i så fall är snabbare att göra en fullständig tabellsökning );
  • Inga andra index på samma tabell är bättre lämpade (MySQL kan bara använda ett index per tabell per delval);

Med tanke på dessa och några andra mer esoteriska varningar är en = jämförelse är mycket snabbare än ett regexp.

Angående liknande

LIKE kan använda ett index om jokertecknet inte är det första tecknet.

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

Prestanda för like när du använder ett index är mycket nära = (förutsatt att samma antal returnerade rader).



  1. Felsökning av variabelt minnesbidrag i SQL Server

  2. hur man hoppar över en dålig rad i ssis platt filkälla

  3. En översikt över uppdragens senaste databasövervakningstjänst - Spotlight Cloud

  4. .Net ORM som fungerar bra med MySQL