SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.04.2011 13:36:36

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Создания поиска по большой таблице

Привет!
Нужно создать поиск по прайсам. Таблица насчитывает свыше 10 мил. записей.
Использую такое выражение:

SELECT prices.marka, MATCH (prices.marka) AGAINST ('Mercedes') AS score
FROM prices
INNER JOIN pricesAccess ON prices.idUser = pricesAccess.idUser
WHERE
MATCH (prices.marka) AGAINST ('+Mercedes*' IN BOOLEAN MODE)
ORDER BY score DESC;

Поиск происходит очень долго (около 20 сек.). Можно ли как-нибуть ускорить процес выборки?

Неактивен

 

#2 22.04.2011 14:27:41

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Создания поиска по большой таблице

Да, можно не выводить score и не делать дополнительно сортировку
в памяти. Почитайте — полнотекстовый индекс сам выводит в пра-
вильном порядке.

Неактивен

 

#3 22.04.2011 14:39:00

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Создания поиска по большой таблице

Сейчас попробую убрать сортировку по score. А подскажите еще, если у меня таблица прайсов будет насчитывать скажем 100 мил. строк. как себя повидет полнотекстовый индекс (производительность выборки уменшится или останется та ж сама)? Или FULLTEXT не приспособлен для громадных таблиц? Может есть другие варианты? Спасибо.

Неактивен

 

#4 22.04.2011 14:43:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Создания поиска по большой таблице

При увеличении объема данных индекс будет деградировать как логарифм
от объема (до тех пор, пока не перестанет влезать в память, потом быстрее,
т.к. бегать по диску всегда дороже, ничего не поделаешь).

Альтернатива — sphinx. Он ведет себя приблизительно так же, разумеется.

Неактивен

 

#5 22.04.2011 14:51:31

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Создания поиска по большой таблице

Вот смотрите, делаю выборку количества строк по критерию:
SELECT COUNT(*) FROM prices
INNER JOIN pricesAccess ON prices.idUser = pricesAccess.idUser
WHERE
MATCH (prices.marka) AGAINST ('+Merced*' IN BOOLEAN MODE);

Среднее время составляет - 14,04с. Это ведь много, это при том что табл. насчитывает всего 2,5 мил. строк. А если туда впихнуть с десяток милионов, то время на выборку увеличится... Разве нет такого решения которое ускоряло б выбору результата на больших таблицах???

Неактивен

 

#6 22.04.2011 15:03:40

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Создания поиска по большой таблице

Вот мне посоветовали при создании большой таблицы (на сервере она ограничена до 2Г) разбить эту табл. на несколько частей с помощью RAID_TYPE = STRIPED. При таком раскладе как будет вести себе полнотекстовый идекс. Производиетльность выборки (тоисть поиск по таблицам) увеличится или нет?

Отредактированно yuriy (22.04.2011 15:07:54)

Неактивен

 

#7 22.04.2011 15:59:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Создания поиска по большой таблице

А какой размер индекса, и какой размер key_buffer_size?

Разбиение таблицы потенциально увеличит скорость добавления новых строк.
Скорость выборки, соответственно, потенциально уменьшит.

Чтобы не потерять — положу для себя документик, на который буду ссылаться
в следующем ответе smile http://lists.mysql.com/mysql/132647

Кстати, если Вы хотите сделать рубрикатор на базе полнотекстового индекса —
может, имеет смысл нормализовать данные?

Неактивен

 

#8 22.04.2011 16:16:28

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Создания поиска по большой таблице

16384 - key_buffer_size. Размер индекса - 134М.
Знаете, проблема сосотоит в том, что при проэктировании таблицы нужно учитывать ее быстрое прополнение даными (загрузка прайсов - 500 тис. строк каждый).
Поэтому возникает резонный вопрос: как не потерять производительность поиска по такой большой таблицы, и во-вторых, что делать если таблица достигнит своего пикового размера (4Г)??? Может Вы сможете разяснить мне поподробней что нужно предпринятть в даном случае? С чего начать?

Отредактированно yuriy (22.04.2011 16:17:26)

Неактивен

 

#9 22.04.2011 16:24:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Создания поиска по большой таблице

А почему пиковый размер таблицы 4 гигабайта? Откуда это следует?

key_buffer_size 16 килобайт? А как оно у Вас вообще запустилось? smile
Сделайте 128 мегабайт хотя бы smile

Неактивен

 

#10 22.04.2011 16:36:39

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Создания поиска по большой таблице

У меня в my.cnf - прописано только key_buffer а не key_buffer_size! Хотя может в Денвере это не катит! Прописал
[isamchk]
key_buffer = 128M
sort_buffer_size = 128M
[myisamchk]
key_buffer = 128M
sort_buffer_size = 128M

4Г прочитал в справочнике. Так значит размер таблицы может достигать значительно больших размеров? (Каких?).
Так насчет моего вопроса, как не потерять производительность поиска при стонях миллионах стпрок таблицы? Я так думаю FULLTEX слабоват в этом случае! Нужно или таблицу разбивать или...)))

Неактивен

 

#11 22.04.2011 18:15:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Создания поиска по большой таблице

Не нравится — не используйте smile

Предлагаю объединить оба обсуждения в одно, т.к. вопросы Вы задаете
приблизительно одинаковые smile и уж точно связанные.

http://sqlinfo.ru/forum/viewtopic.php?pid=24402#p24402

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson