как улучшить поиск MySQL REGEXP? - PullRequest
0 голосов
/ 05 января 2012

Вопрос есть,

1.Как я могу улучшить производительность SELECT запросов в MySQL, используя REGEXP?

Таблица выглядит как

create table `tweets`(
    `id` bigint auto_increment,
    `tweet` varchar(140),
    `time` datetime,
    primary key(`id`)
);

Здесь следующий запрос занимает около 0,35 секунд .

select tweet from tweets where tweet regexp '^[abcdef]{1,4}$';
  1. Будет ли индексирование tweet быстрее? Если да, какой тип индекса мне следует использовать?
  2. Мой движок стола InnoDB, есть ли другой движок стола, который станет полезным?

Ответы [ 2 ]

3 голосов
/ 05 января 2012

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

Если бы мне пришлось придумать способ для этого, я бы изучил шаблоны, по которым обычно производился поиск, и пометил их каким-то индексируемым способом.во время вставки.Например, если вы используете выражение ^[abcdef]{1,4}$ для поиска по множеству, я бы сделал логический столбец first4AThruF и в триггере вставки / обновления изменил бы столбец на true или false в зависимости от того, соответствует ли он обычномувыражение.Если бы я проиндексировал столбец first4AThruF, и этот столбец имел достаточную избирательность, я мог бы написать запрос:

select tweet from tweets where first4AThruF = true;

, и это должно быть довольно быстрым.

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

1 голос
/ 06 декабря 2012

Если искомый поиск находится в начале строки, вы можете использовать LIKE в качестве фильтра высокого уровня, а затем проверить снова с помощью REGEXP:

select tweet from tweets 
where 
    ( 
      tweet LIKE 'a%' OR
      tweet LIKE 'b%' OR
      tweet LIKE 'c%' OR
      tweet LIKE 'd%' OR
      tweet LIKE 'e%'
    )
    AND LENGTH(tweet) <= 4 -- try taking this line out line too
    AND tweet regexp '^[abcdef]{1,4}$';

Несмотря на то, чтонемного запутанный, это должно быть намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...