Mellon
Mellon

Reputation: 38882

REGEXP performance (compare with "LIKE" and "=")

I am using MySQL. I have asked a question about how to query in database for a single word match here.

For example, compare with = operation, e.g. WHERE column_name='value', is the REGEXP operation far more slow than = for large table?

Can I say, = is the fastest operation, then LIKE , and REGEXP is the poorest one from performance perspective?

Upvotes: 18

Views: 15521

Answers (2)

Johan
Johan

Reputation: 76724

Regarding regexp

The regexp can never use an index in MySQL.
The = will use an index if:

  • an index is declared on the column;
  • the values in the column have sufficient cardinality (if more than +/- 20% of the rows match, MySQL will not use an index, because in that case doing a full table scan is faster);
  • No other indexes on the same table are better suited (MySQL can only use one index per table per subselect);

Considering these and some other more esoteric caveats an = comparison is much faster than a regexp.

Regarding like

LIKE can use an index if the wildcard is not the first char.

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

The performance of like when using an index is very close to = (assuming the same number of rows returned).

Upvotes: 38

ravnur
ravnur

Reputation: 2852

There is another way to search data: Full-Text Search. It can be used when like, = is not enough (executing time) and on the other hand Sphinx, Lucene is too powerfull.

To used it you should create full-text index on a column and query it. If you will use it please be aware of ft_min_word_len, ft_max_word_len system vars that reduce min/max size words.

Hope it helps.

The rest of your question was answered by @Johan.

Upvotes: 0

Related Questions