Поиск по большой базе даных

antono

Новичок
Поиск по большой базе даных

Уже два дня бьюсь как рыба об лед, никак не могу найти решение. Есть база данных, там ищутся в 3 колонках ключевые слова методом LIKE %word%. Это быстрее чем REGEXP (word) примерно на 50%, это я проверил.
Когда было несколько тысяч записей, все было четко и быстро, но как только закачал несколько десятков тысяч, стало жутко тормозить. Создание индексов не помогает, они только для точного поиска или по началу слова.
Та вот вопрос - как ускорить поиск ключевых слов в больших таблицах? Есть ли вообще варианты и если есть то куда копать?
 

SunDrop

Помощник поисков. робота
НА засыпку:
А зачем тебе искать именно внутри слова? Именно LIKE %word%?
Это прайс строки? Или что-то другое?
Полнотекстовые индексы не подойдут?
 

antono

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

То есть чтобы нашлись все записи содержащие слово "игра"
 

MadMike

Новичок
А нельзя нормализовать?
1 таблица - (keyword_id int(11), keyword_normalized varchar(255)),
2 таблица - связи keyword_id/data_id (id данных в исходной таблице)
Киворд нормализованный, естественно.
 

antono

Новичок
MadMike, это скорее всего не то.

ForJest, спасибо огромное! Это то что нужно было.
 

Groove

Новичок
antono
самый первый ответ был тоже про это)))
:
>>Полнотекстовые индексы не подойдут?
 

bzik

Новичок
Но искать по типу LIKE %word% fulltext не сможет. Только LIKE word%
 

Wicked

Новичок
bzik, а разве full-text использует не MATCH (field1, field2) AGAINST ('keyword') ?
 

antono

Новичок
А еще вот такой вопросик назрел - если сделать запрос с вычислением релевантности:

mysql> SELECT id, body, MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root') AS score
-> FROM articles WHERE MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root');

и еще обрезать его LIMIT 10,10 например - то он покажет только 10 записей. А как узнать сколько всего нашел запрос записей? Это нужно чтобы правильно пронумеровать страницы в результате поиска. Или все таки LIMIT нельзя использовать и нужно искать без него и затем выбирать диапазон скриптом?
 
Сверху