Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация поиска по 9млн записей. / 8 сообщений из 8, страница 1 из 1
07.04.2004, 09:34
    #32471536
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация поиска по 9млн записей.
Привет всем!
Есть проблема, уже не знаю куда копать, может поможите.
Что есть: 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 тис.фирм), то задержка просто нереальная.

Как и что можно оптимизировать?
...
Рейтинг: 0 / 0
07.04.2004, 10:41
    #32471675
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация поиска по 9млн записей.
Проблема тут ясна.. Это конструкция 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%' очень даже легко использует индексы (которые конечно надо все равно создать)
...
Рейтинг: 0 / 0
07.04.2004, 11:04
    #32471744
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация поиска по 9млн записей.
то Хрен:
Спасибо за советы, теперь есть куда копать ;)
Обновлю MySQL, раставлю индексы на name и address, каждому по индексу, может еще и двойной индекс на них сделать, в случае поиска по name и address?
key_buffer 150М - а предел есть? эти мегабайты отедаются из памяти сразу или по мере надобности?
query_cache_size 20..30 - а если, например, 10 юзеров работают с табличкой?
Смотрел полнотекстный поиск, немного не то , там точное соответствие, а мне нужно с %...%, вот разве что про вариант без первого %, я думал про него, наверное так и сделаю как альтернатива, если точно известно начало фирмы.
...
Рейтинг: 0 / 0
08.04.2004, 08:19
    #32472945
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация поиска по 9млн записей.
Установка MySQL 4, key_buffer, query_cache_size координально ничего не изменила, кроме того, что теперь хочет загружаться у меня только как сервис, что не очень мне подходит, а из команднос строки никак не подымается, странно.
Вариант с LIKE '.....%' не подходит, в принципе (такая структура данных), остается только LIKE '%.....%' . Так что индексы думаю на полях name, address не нужны.
ЗЫ: Как запускать MySQL 4 из командноы строки , НЕ как сервис? (нужно к Денверу прикрутить.)
...
Рейтинг: 0 / 0
08.04.2004, 15:00
    #32473874
AlexPretov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация поиска по 9млн записей.
[QUOTE crumb]Как запускать MySQL 4 из командноы строки , НЕ как сервис? (нужно к Денверу прикрутить.) [/QUOTE]
Код: plaintext
mysqld-max --standalone --console


________________
С уважением, Alex Pretov
...
Рейтинг: 0 / 0
11.04.2004, 21:28
    #32476888
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация поиска по 9млн записей.
А вот ответьте наверняка, стоит ставить индексы на поле, по которому идет поиск типа:
Код: plaintext
1.
2.
3.
SELECT * FROM table WHERE name LIKE '%....%'
или
SELECT * FROM table WHERE name LIKE '%....%' OR name LIKE '%....%' 

или нет?
Проверял по скорости, вроде как индексы не помогаю.
А то слишком много кушают эти индексы, при больших объемах очень сказывается.
...
Рейтинг: 0 / 0
12.04.2004, 17:11
    #32477972
sky2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация поиска по 9млн записей.
Индекс mysql при %xxx% не использует
будут использоваться если xxx% , так всё будет работать быстро

инфу по исвпользованию индексов можно проверить по запросу
EXPLAIN SELECT ............
...
Рейтинг: 0 / 0
25.04.2004, 21:25
    #32495884
Vladimir Dozen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация поиска по 9млн записей.
а средняя длина названия какая?

можно пойти тупым путем -- создать отдельную таблицу
для поиска, где для название фирмы типа "рога и копыта"
хранить записи со ссылкой на оригинальную запись (id=1234):

1234, 'рога'
1234, 'ога'
1234, 'копыта'
1234, 'опыта'
1234, 'пыта'
1234, 'ыта'

получишь миллионов двести-триста коротких записей.
число букв ограничить как минимум тремя (искать %а% по 9 миллионам
названий смысла мало).

для этой таблицы создать индекс, и искать по 'ога%'. индекс будет использоваться. должно быть быстро.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация поиска по 9млн записей. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]