MySQL - ускорение регулярных выражений - PullRequest
3 голосов
/ 08 марта 2010

У меня есть таблица:

+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| idurl  | int(11)          | NO   | PRI | NULL    | auto_increment |
| idsite | int(10) unsigned | NO   | MUL | NULL    |                |
| url    | varchar(2048)    | NO   |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+

оператор выбора:

SELECT idurl,
       url
  FROM URL
 WHERE idsite = 34
   AND url REGEXP '^https\\://www\\.domain\\.com/checkout/step_one\\.php.*'

Запросу требуется 5 секунд для таблицы с 1000000 строками. Можно ли добиться ускорения с помощью индексов или еще чего-нибудь?

Ответы [ 4 ]

3 голосов
/ 08 марта 2010

Похоже, что LIKE может быть достаточно. LIKE использует% в качестве символа подстановки для любого количества символов.

AND url LIKE 'https://www.domain.com/checkout/step_one.php%'

LIKE не требует начального якоря, как ^. Только второй пример будет соответствовать:

'Sherlock and Watson' LIKE 'and%'
'Sherlock and Watson' LIKE '%and%'
'Sherlock and Watson' LIKE '%and'
2 голосов
/ 08 марта 2010

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

Что может помочь вам, в зависимости от того, сколько уникальных значений IDSITE у вас есть, это либо разместить индекс на IDSITE, либо сделать начальный выбор WHERE IDSITE = 34, и использовать этот подзапрос в качестве цели вашего запроса по URL.

Что-то вроде:

select
    idurl,
    url
from
    (select idurl, url from uwe_url where idsite = 34)
where
    url REGEXP '^https\\://www\\.domain\\.com/checkout/step_one\\.php.*'

Но я почти уверен, что вы не сможете обойти текстовый разбор для совпадения столбца URL.

0 голосов
/ 08 марта 2010

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

Вы можете разделить домен на отдельное поле, проиндексировать его и использовать в предложении where. Если хранимые вами URL-адреса относятся к разным доменам, такой индекс может значительно повысить производительность.

0 голосов
/ 08 марта 2010

Похоже, вам не нужен этот REGEXP.

Этого пункта должно быть достаточно:

AND eu.url LIKE 'https://www.domain.com/checkout/step_one.php%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...