Подтвердить что ты не робот

Производительность RegEx против LIKE в запросах MySql

По слухам, это:

SELECT * FROM lineage_string where lineage like '%179%' and  lineage regexp '(^|/)179(/|$)'

Быстрее, чем это:

SELECT * FROM lineage_string where lineage regexp '(^|/)179(/|$)'

Кто-нибудь может подтвердить? Или знайте достойный способ проверить скорость таких запросов. Благодаря

4b9b3361

Ответ 1

Вполне возможно, что это может быть быстрее, потому что условие LIKE может быть оценено быстрее, чем регулярное выражение, поэтому, если большинство строк не пройдут тест, оно может быть быстрее. Однако будет медленнее, если большинство строк выполнятся успешно, так как для успешных строк нужно запустить два теста, а не один. Это также зависит от того, какое выражение оптимизатор выберет для запуска первым.

Еще большее ускорение можно увидеть, если у вас есть что-то вроде этого:

SELECT * FROM (
   SELECT * FROM lineage_string
   WHERE lineage LIKE '179%'
) WHERE lineage regexp '^179(/|$)'

Теперь индекс можно использовать для поиска вероятных строк, поскольку LIKE '179%' является sargable. Многие строки вообще не нужно проверять.

Как всегда, лучший способ убедиться в этом - измерить это для себя на основе фактических данных.

Ответ 2

Да, скорее всего, это будет немного быстрее, потому что standard-SQL LIKE - это более простая операция сравнения, чем полный парсер для регулярного выражения.

Однако в реальных условиях оба они очень медленные, потому что ни один из них не может использовать индексы. (LIKE может использовать индекс, если строка соответствия не начинается с подстановочного знака, но это не так.)

Если вы обеспокоены скоростью, вы должны изменить свою схему, чтобы вы могли поместить 179 непосредственно в столбец и индексировать ее, вместо того, чтобы вручную проверять строку в каждой строке.