Чем заменить медленный запрос с LIKE?

Есть не очень расторопная БД (FileMaker через ODBC, Mac OS X Server) на 15 тыс. записей с плохой структурой, по которой нужно быстро (менее секунды) делать поиск по одному полю. Поле сборное. В нем хранятся номера телефонов через пробел, например, «5555555 4564472 89184533335».


Поиск делается запросом типа

SELECT name FROM table WHERE phones LIKE '%4564472%'



Работает это очень медленно. Как спасать ситуацию?
  • Вопрос задан
  • 9406 просмотров
Решения вопроса 1
@MikhailEdoshin
На всякий случай проверьте, проиндексировано ли поле с телефонами; если нет или index minimal, переставьте на all. Скорее всего, проиндексировано, конечно.

Оптимальный вариант — переделать как советует da0c, только фиксированной длины не надо и пробелами не надо добивать, в FM это бессмысленно. Я тут потестировал одну относительно несложную переделку, но она еще медленнее оказалась.

Если база на сервере и SQL не принципиален, можно через HTTP GET данные запрашивать; данные будут в XML, но при желании в версии до 11 включительно можно их прямо там через XSLT прогнать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 8
Stdit
@Stdit
Ответ написан
Комментировать
@da0c
Предлагаю поменять структуру, добавить табличку phones которая относится с table как многие(со стороны phones) к одному. Поле table.phones один раз распарсить и положить аккуратно в таблицу phones, так, чтобы в одной записи лежал один телефон. Причем поле с телефоном сделать фиксированной длины, короткие телефоны добивать справа пробелами. После всего этого сделать индекс в таблице phones по этому полю и, по идее, скорость должна в разы увеличиться.
Ответ написан
Комментировать
Anonym
@Anonym
Программирую немного )
Я так понимаю, номера телефонов хранятся строкой. Тогда с минимальными изменениями БД можно попробовать Fulltext индекс и поиск через MATCH/AGAINST.
Ответ написан
Комментировать
@Dzen_Marketing
Есть ли возможность вмешается в логику? Сфинкс примастырить например
Ответ написан
Комментировать
ipadm
@ipadm
Ну я бы для 15 тысяч записей точно переделал-бы структуру. Обязательно проиндексируй поля, ну и рассмотри вопрос смены драйвера ODBC на что-то менее тормознутое, к примеру OLE DB
Ответ написан
vaniaPooh
@vaniaPooh
Можно попробовать закэшировать это во временную таблицу в памяти.
Ответ написан
Комментировать
Переделать эту грёбаную таблицу на две других (см. ответы выше) + поставить VIEW который не испортит логику программы.
Вы BTREE индексы не забыли? Не знаю насколько это возможно в вашей системе.
Ответ написан
Комментировать
dmgorsky
@dmgorsky
Извините, не знаком с FileMaker. Но, возможно, наведёт на размышления.
В Oracle есть возможность создать индекс на основе функции.
Т.е. искать where instr(phones, '4564472') != 0, создав индекс по instr(phones, '4564472').
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы