Использование Like и Concat в запросе MySQL - PullRequest
1 голос
/ 24 мая 2011

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

Я загружаю файл, используя LOAD INFILE CONCURRENT, и у меня нет проблем с этим.

Искривление связано с тем, что поле, которое я пытаюсь сопоставить в необработанной текстовой таблице (occupationoraffiliation), содержит больше, чем просто названия организаций. Поэтому я пытаюсь использовать LIKE с символами подстановки, чтобы соответствовать строкам.

Чтобы соответствовать тексту, я пытаюсь использовать этот запрос:

UPDATE raw_faca JOIN orgs AS o
    ON raw_faca.org_id IS NULL AND raw_faca.occupationoraffiliation LIKE CONCAT('%',o.org_name,'%')
SET raw_faca.org_id = o.org_id;

Я тоже пробовал без CONCAT:

UPDATE raw_faca JOIN orgs AS o
    ON raw_faca.org_id IS NULL AND raw_faca.occupationoraffiliation LIKE ('%' + o.org_name + '%')
SET raw_faca.org_id = o.org_id;

Таблица raw_faca содержит ~ 40 000 строк, а таблица orgs - ~ 20000 строк. У меня есть индексы для всех. Запрос был запущен в течение нескольких часов или около того - это кажется слишком длинным для операции. Это сравнение, которое я пытаюсь провести, просто неэффективно, или я делаю что-то невероятно глупое? Я надеялся избежать построчного использования внешнего php или python-скрипта.

В ответ на комментарии ниже об использовании Match . . . Against я пробовал также следующий запрос:

UPDATE raw_faca JOIN orgs AS o ON raw_faca.org_id IS NULL AND MATCH(raw_faca.occupationoraffiliation) AGAINST (o.org_name IN NATURAL LANGUAGE MODE)
SET raw_faca.org_id = o.org_id; 

И это дает мне эту ошибку:

incorrect arguments to AGAINST

Есть мысли?

1 Ответ

3 голосов
/ 24 мая 2011

Предложение LIKE с лидирующим подстановочным знаком не сможет использовать какие-либо индексы.

...