|
Оптимизация поиска по 9млн записей.
|
|||
---|---|---|---|
#18+
Привет всем! Есть проблема, уже не знаю куда копать, может поможите. Что есть: MySQL 3, W2k, Apache, Celeron 2.3@2.8, 256Mb Таблица firms: id,serial,code,date,name,address. id - примари кей, code - индекс. Объем таблицы 9 млн записей, 1Гб. Все это крутиться под винду на локалхосте. Нужно: Делать поиск по полю(ям) name и/или address c учетом поля code. Допустим юзер вводит несколько слов для поиска и делается запрос такого вида: SELECT * FROM firms WHERE (name LIKE '%имя_фирмы%' OR name LIKE '%имя_фирмы2%') AND code>0 или: SELECT * FROM firms WHERE (name LIKE '%имя_фирмы%' OR name LIKE '%имя_фирмы2%') OR (address LIKE '%имя_фирмы%' OR address LIKE '%имя_фирмы2%') AND code>0 Так вот запрос длиться от 50 до 100 сек если слов для поиска 2-3, а если больше, да еще и большая выборка (находит около 10 тис.фирм), то задержка просто нереальная. Как и что можно оптимизировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2004, 09:34 |
|
Оптимизация поиска по 9млн записей.
|
|||
---|---|---|---|
#18+
Проблема тут ясна.. Это конструкция like '%чтотоздесь%', Приходится искать подстроки, которые находятся в середине поля, поэтому индексы практически не могут быть применены. Посоветовать что-то радикальное тут сложно, но все-же: - я бы посоветовал обновить mysql до версии 4. Первая цифра в номере версии была изменена в mysql, когда в нем очень основательно переписали внутренности, так что версия 4 масштабируется на большие обьемы данных значительно лучше.. - добавьте индексы, по одному на name и на address. mysql все равно будет вынужден перебирать записи по одной, однако такие индексы дадут возможность оптимизатору брать данные для перебора только из индексных файлов, не обращаясь к файлу данных. Это будет немного быстрее.. И соответсвенно надо раздуть параметр key_buffer в my.ini до размера, какой только возможен.. Скажем до 150M - если поставите mysql 4, установите query_cache_size мегабайт в 20..30. Это позводит ускорить выборку в некоторых частных случаях, если скажем 2 человека ищут одну и ту же фирму (или если человек ищет ее несколько раз) Все это были полумеры, и честно говоря они могут дать только непринципиальнй эффект. Вот несколько более коренных вещей, которые можно рассмотреть: - посмотрите fulltext search . Может быть подойет. - посмотрите, нет ли возможности изменить like '%blahblahblah%' на 'blahblahblah%'.. То есть организовать быстрый поиск по _началу_ названия (и скажем отдельной кнопкой медленный поиск в таком виде как он есть сейчас).. Констпукция like 'blah%' очень даже легко использует индексы (которые конечно надо все равно создать) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2004, 10:41 |
|
Оптимизация поиска по 9млн записей.
|
|||
---|---|---|---|
#18+
то Хрен: Спасибо за советы, теперь есть куда копать ;) Обновлю MySQL, раставлю индексы на name и address, каждому по индексу, может еще и двойной индекс на них сделать, в случае поиска по name и address? key_buffer 150М - а предел есть? эти мегабайты отедаются из памяти сразу или по мере надобности? query_cache_size 20..30 - а если, например, 10 юзеров работают с табличкой? Смотрел полнотекстный поиск, немного не то , там точное соответствие, а мне нужно с %...%, вот разве что про вариант без первого %, я думал про него, наверное так и сделаю как альтернатива, если точно известно начало фирмы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2004, 11:04 |
|
Оптимизация поиска по 9млн записей.
|
|||
---|---|---|---|
#18+
Установка MySQL 4, key_buffer, query_cache_size координально ничего не изменила, кроме того, что теперь хочет загружаться у меня только как сервис, что не очень мне подходит, а из команднос строки никак не подымается, странно. Вариант с LIKE '.....%' не подходит, в принципе (такая структура данных), остается только LIKE '%.....%' . Так что индексы думаю на полях name, address не нужны. ЗЫ: Как запускать MySQL 4 из командноы строки , НЕ как сервис? (нужно к Денверу прикрутить.) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2004, 08:19 |
|
Оптимизация поиска по 9млн записей.
|
|||
---|---|---|---|
#18+
[QUOTE crumb]Как запускать MySQL 4 из командноы строки , НЕ как сервис? (нужно к Денверу прикрутить.) [/QUOTE] Код: plaintext
________________ С уважением, Alex Pretov ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2004, 15:00 |
|
Оптимизация поиска по 9млн записей.
|
|||
---|---|---|---|
#18+
А вот ответьте наверняка, стоит ставить индексы на поле, по которому идет поиск типа: Код: plaintext 1. 2. 3.
или нет? Проверял по скорости, вроде как индексы не помогаю. А то слишком много кушают эти индексы, при больших объемах очень сказывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2004, 21:28 |
|
Оптимизация поиска по 9млн записей.
|
|||
---|---|---|---|
#18+
Индекс mysql при %xxx% не использует будут использоваться если xxx% , так всё будет работать быстро инфу по исвпользованию индексов можно проверить по запросу EXPLAIN SELECT ............ ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2004, 17:11 |
|
Оптимизация поиска по 9млн записей.
|
|||
---|---|---|---|
#18+
а средняя длина названия какая? можно пойти тупым путем -- создать отдельную таблицу для поиска, где для название фирмы типа "рога и копыта" хранить записи со ссылкой на оригинальную запись (id=1234): 1234, 'рога' 1234, 'ога' 1234, 'копыта' 1234, 'опыта' 1234, 'пыта' 1234, 'ыта' получишь миллионов двести-триста коротких записей. число букв ограничить как минимум тремя (искать %а% по 9 миллионам названий смысла мало). для этой таблицы создать индекс, и искать по 'ога%'. индекс будет использоваться. должно быть быстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2004, 21:25 |
|
|
start [/forum/topic.php?fid=47&msg=32471675&tid=1855223]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 21ms |
total: | 162ms |
0 / 0 |