Оптимизация выборки: индексы и полнотекстовый поиск

kode

never knows best
Оптимизация выборки: индексы и полнотекстовый поиск

Есть таблица:

id, user, dir, filename, size, md5

Кол-во рядов на данный момент: 1,313,169
Размер скромен: 395,025 КБ

Есть индексы:
FULLTEXTовый - dir, filename = fulltext_path
и простой dir, filename = filepath

При полнотекстовом поиске с условием, аля

Код:
SELECT * FROM files WHERE MATCH (filename,dir) AGAINST ('beck') ORDER BY `user` ASC, `dir` ASC;
Всё тип топ, выборка происходит за 0.0097 сек

Но в полнотекстовом поиске есть небольшой недостаток:
Если файл называется beck_01 то его не найдёт :)

Посему используем обычную выборку:
Код:
SELECT * FROM files FORCE INDEX (filepath) WHERE `dir` LIKE '%beck%' OR `filename` LIKE '%beck%' ORDER BY `user` ASC, `dir` ASC;
Но тут результат просто чертовски негоден: 10.37 сек
Это даже несмотря на то что используется индекс.
С раздельными индексами результат аналогичный.....

Что посоветуете.....

Мускул - 4.1
 

zerkms

TDD infected
Команда форума
делать 1ый запрос по dir с использованием полнотекстового индекса, 2ой запрос - по filename с использованием обычного (при условии, что тебе нужно искать `filename` = $somename . '%')
 

kode

never knows best
ну во первых полнотекстовый поиск по директориям не даёт нормального результата, ибо /home/code/beck_music/ пропустится.....

во вторых - искомый результат может быть как и в имени директории, так и в имени файла, например:

dir: /home/code/beck_music
file: track-01.flac
 

zerkms

TDD infected
Команда форума
kode
вполне логично что при запросе SELECT * FROM files WHERE MATCH (filename,dir) AGAINST ('beck') ORDER BY `user` ASC, `dir` ASC; не найдётся /home/code/beck_music/
вообще жутко странно - что ты, вместо того, чтобы сделать так, как тебе надо - делаешь хоть как-нибудь
по поводу нормального поиска - а что если повторять структуру ФС и хранить путь в древовидной структуре?
 

kode

never knows best
Автор оригинала: FractalizeR
А если
Код:
...MATCH (filename,dir) AGAINST ('beck*' IN BOOLEAN MODE)
?
Thank you, im thinking about boolean mode before, но не пытался использовать его до сего момента :)

MATCH (filename,dir) AGAINST ('*beck*' IN BOOLEAN MODE)

Работает отлично
 
Сверху