Xwab
Форумыnavigate_nextБазы данных

Великим оптимизаторам
Сообщения
G.N.C.

Вот поисковый запрос, БД (Инвертированный индекс)~1,000,000,000 записей, партиционированна на 256 частей, скорость запроса 300-400 мс, но в ближайшем будущем объем будет в 10-20 раз больше. Возможно у вас будут идеи по оптимизации ЗАПРОСА?
---
За масштабирование не беспокойтесь.
---
Запрос:

Select (rel) as rel, gsiteid, id FROM (Select count(*) as cnt,(sum(rels*idf)) as rel,(gsiteid) as gsiteid,id FROM ( (SELECT rel as rels,gsiteid,id, '0.954' as idf FROM a06 WHERE id_word='7323' ) UNION ALL (SELECT rel as rels,gsiteid,id, '0.001' as idf FROM aa0 WHERE id_word='22912' ) UNION ALL (SELECT rel as rels,gsiteid,id, '0' as idf FROM aad WHERE id_word='9371' ) ) as allidx GROUP by id HAVING cnt>='2' ORDER by rel DESC) as allidx GROUP by gsiteid ORDER by rel DESC LIMIT 100

Структура таблицы:
id_word
gsiteid
id
avg_position
rel
---
Индексы:
Покрывающий индекс + индекс по rel
---
Почему-то думаю, что постов в теме не будет.

23 Окт 2012, 13:44
Башка

Словестно опиши какие данные нужны и какие условия к ним предоставляются

23 Окт 2012, 18:18
G.N.C.

Башка, нужно получить из огромных таблиц rel,gsiteid,id, далее выбрать результаты, число совпадений больше n и сгруппировать по id, плюс посчитать суммарную релевантность (sum(rel*idf)). Далее нужно сгруппировать по gsiteid и отсортировать по релевантности (rel).
^ примерно такой алгоритм сейчас
добавлено спустя 55 секунд:
А цель получить отсортированный список сгруппированный сначала по одному, потом по другому полю и нескольких огромных таблиц (партиций)
добавлено спустя 43 минуты:
Кстати это не критично, то есть не является проблемой, но вдруг у кого-то появится идея...

23 Окт 2012, 22:18
oee

может использовать что-то более адаптированное под высокие нагрузки чем mysql

23 Окт 2012, 22:32
delef

oee, рассуждать так не стоит, mysql здесь непричем. И на нем высокие нагрузки тоже выдержать можно, главное качественно прорабатывать каждый запрос.


__________
посл.ред. 24 Окт 2012, 9:18; всего 1 раз 23 Окт 2012, 22:50
roboforex

Ребята обьясните мне из-за чего допустим mysql сможет обработать больше обьем текста за тоже время чем средствами php функций, что на сервере mysql стоит отдельный процесор от интерпритатора php функций, если процесор тот же то время обработки текста должно быть примерно одинаковое.

24 Окт 2012, 3:09
Vitaliy

roboforex, для этого есть топ-тема. Задавай вопросы тут: http://xwab.mobi/forum/topic27292

24 Окт 2012, 5:40
Башка

G.N.C., ну первое что приходит на ум это больше вычислительных мощностей ) второе, это частое использование в твоем запросе строк, когда нужны числа, арифметические вычисления mysql с числами выполняет быстрее чем со строками. А где у тебя порционность то?

24 Окт 2012, 8:14
Flyd

roboforex пишет:
"Ребята обьясните мне из-за чего допустим mysql сможет обработать больше обьем текста за тоже время чем средствами php функций, что на сервере mysql стоит отдельный процесор от интерпритатора php функций, если процесор тот же то время обработки текста должно быть примерно одинаковое."

Индексы там есть

24 Окт 2012, 8:16
G.N.C.

oee, я сказал, в архитектуру не лезьте. В данном проекте, опытным путем вернулся на MySQL, как это не удивительно, но в этом случае именно Mysql выигрывала в производительности у других СУБД....
добавлено спустя 2 минуты:
Башка, применяются практически все возможные технологии масштабирования, включая горизонтальное, поэтому я не советую лезть в архитектуру, хотя если особое желание есть, я не против
добавлено спустя 34 минуты:
roboforex, в MySQL применяются индексы, а также значительно более оптимизированные алгоритмы... И еще, да пойми ты, в поисковых системах поиск не происходит по тексту, поиск ведется по инвертированному индексу! По другому практически не как!
добавлено спустя 3 минуты:
Башка,
id_word -integer
gsiteid - integer
id - integer
avg_position -numeric
rel - numeric

24 Окт 2012, 10:19
Ответить на тему