2012-04-27 2 views
1

Предположим, что существует индекс на целочисленном столбце id,Действительно ли поиск регулярных выражений по столбцу int эффективно?

как мне эффективно находить те записи, в которых id матчи %789%?

id LIKE '%789%' не сможет использовать индекс и будет иметь проблемы с производительностью.

Есть ли уловка для эффективной работы?

+0

Я подозреваю, что вы задаете неправильный вопрос. Я ожидаю, что есть более аккуратный и более эффективный способ достижения того, что, по-вашему, вы пытаетесь сделать. На базовом уровне вы можете иметь таблицу с одним столбцом, содержащим все целые числа, не соответствующие вашей спецификации. Просто используя эту таблицу в объединениях, вы будете лишать строки, которые вы не хотите, намного эффективнее. – aidan

ответ

0

Вы можете создать вычисляемый столбец, такой как convert (varchar (20), int_column) и поместить на него индекс. Всякий раз, когда вы хотите использовать оператор LIKE против int_column, вы должны сделать это вместо вычисленного столбца.

+0

Извините, добавление другой колонки НЕ приемлемо в моем случае. –

0

Если ваш образец действительно упакован вместе (а не что-то вроде% 4% 5% 6%), вы можете рассмотреть возможность расширения шаблона в соответствующие целые сравнения. Это действительно взорвет ваш код, но значительно ускорит фактический поиск.

Try:

mod(id, 1000) = 789 or 
(7890 <= mod(id, 10000) and mod(id, 10000) < 7900) or 
(78900 <= mod(id, 100000) and mod(id, 100000) < 79000) or 
(789000 <= mod(id, 1000000) and mod(id, 1000000) < 790000) or 
... 
(789000000 <= mod(id, 1000000000) and mod(id, 1000000000) < 790000000 

Очевидно, что если вы знаете, диапазон ключа ограничен, вы можете уменьшить количество сравнений.

+0

Действительно ли это оптимизировано? Я думаю, что сервер sql все равно должен перебирать ** все ** записи, чтобы выполнить все сравнения. –

+0

OP сказал, что у него есть индекс на целочисленном столбце. Выполнение целочисленного сравнения по целочисленному индексу должно быть довольно быстрым. –

+0

Есть ли способ дальнейшего ограничения количества проверенных строк? Поскольку 'explain' показывает, что этот тип sql все равно сканирует все строки. –

Смежные вопросы