Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как ускорить select на пересечение множеств? / 13 сообщений из 13, страница 1 из 1
12.02.2016, 01:43:27
    #39169138
Ovold
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Подскажите пожалуйста, как ускорить получение пересечения множеств из таблицы?

Есть запрос такого вида:

SELECT *
FROM $table_index_kontent
WHERE slovo_id IN (1,2,3,4,5)
GROUP BY kontent_id
HAVING count(kontent_id)=5
ORDER BY k DESC
LIMIT 10

При росте объёма таблички свыше 10 000 000 записей начинаются лаги. Иногда даже выход за пределы таймаута. Что можно сделать, чтобы выборки пересечения множеств из таблиц происходили побыстрее?
...
Рейтинг: 0 / 0
12.02.2016, 04:54:43
    #39169151
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Ovold,

ddl покажите
...
Рейтинг: 0 / 0
12.02.2016, 06:57:18
    #39169173
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Ovold,

...и на всякий пожарный еше и реальный селект,
а то на SELECT * ... GROUP BY у некоторых
тут аллергия...
...
Рейтинг: 0 / 0
12.02.2016, 09:14:22
    #39169242
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Если максимальное количество литералов в группе невелико, то для каждого возможного количества литералов в группе значений поиска создать свой запрос, использующий соответствующее количество копий исходной таблицы с пре-JOIN отбором. Объединение можно сделать в рамках ХП, либо использовать динамическое формирование текста запроса.
...
Рейтинг: 0 / 0
12.02.2016, 10:57:01
    #39169324
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
OvoldПодскажите пожалуйста, как ускорить получение пересечения множеств из таблицы?

Есть запрос такого вида:

SELECT *
FROM $table_index_kontent
WHERE slovo_id IN (1,2,3,4,5)
GROUP BY kontent_id
HAVING count(kontent_id)=5
ORDER BY k DESC
LIMIT 10



быстрее будут пять join-ов.
...
Рейтинг: 0 / 0
12.02.2016, 17:48:26
    #39169796
Ovold
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Спасибо за некоторые идеи.

Я покачто не совсем понимаю сам механизм поиска пересечения множеств, как он работает в MySQL.
Допустим, есть N запросов

SELECT kontent_id FROM $table_index_kontent WHERE slovo_id=1 ORDER BY k DESC
SELECT kontent_id FROM $table_index_kontent WHERE slovo_id=2 ORDER BY k DESC
.....
SELECT kontent_id FROM $table_index_kontent WHERE slovo_id=$N ORDER BY k DESC

Каждый запрос отдаёт какое-то множество, которое в общем случае может быть большим. Ну, например 1 000 000 результатов.

Требуется найти пересечение этих множеств. Самое разумное решение, что я нашёл, я привёл в первом посте. Но быстродействие слишком низкое.
...
Рейтинг: 0 / 0
12.02.2016, 18:33:49
    #39169843
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Код: sql
1.
2.
3.
4.
5.
6.
7.
(SELECT kontent_id FROM $table_index_kontent WHERE slovo_id=1) x1
INNER JOIN
(SELECT kontent_id FROM $table_index_kontent WHERE slovo_id=2) x2 ON x1.kontent_id = x2.kontent_id
INNER JOIN
-- ...
INNER JOIN
(SELECT kontent_id FROM $table_index_kontent WHERE slovo_id=N) xN ON x1.kontent_id = xN.kontent_id
...
Рейтинг: 0 / 0
12.02.2016, 18:36:07
    #39169847
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Поскольку все связывания внутренние, перенос предотбора в ON не имеет смысла. Хотя можно попробовать STRAIGHT_JOIN, если есть заведомо более узкий, чем остальные, фильтр.
...
Рейтинг: 0 / 0
15.02.2016, 02:09:18
    #39170940
Ovold
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Akina, Извините, но что-то я в упор не понимаю, как так можно сделать.
MySQL выдаёт ошибку синтаксиса на все попытки так сделать.

Через INNER JOIN можно решить задачу вот так

SELECT x1.kontent_id,x2.kontent_id, xN.kontent_id
FROM table as x1
INNER JOIN
table as x2
on x1.kontent_id=x2.kontent_id
INNER JOIN
table as xN
ON x2.kontent_id=xN.kontent_id
WHERE x1.slovo_id=1 and x2.slovo_id=2 and xN.slovo_id=N;


Но работает в разы медленне, чем в том варианте, что я привёл в первом посте. Как бы получить более высокое быстродействие?
...
Рейтинг: 0 / 0
15.02.2016, 02:20:08
    #39170941
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Ovold,

1. погуглите EXPLAIN и выдайте сюда результаты для
все сравниваемых запросов

2. приведите конкретное время выполнения всех
сравниваемых запросов. ВЫполнять 3 раза.
после SELECT поставьте SQL_NO_CACHE

3. озвучте время которое вас бы устроило.
...
Рейтинг: 0 / 0
21.02.2016, 01:11:02
    #39176339
Ovold
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Протестировал 2 способа получения выборки.
Тестировал достаточно много раз. Для чистоты эксперимента после каждого запроса подавалась команда RESET QUERY CACHE

Скорость выполнения запросов такая:
1 случай. с группировкой. ( GROUP BY )
Движок Myisam
Среднее время 0,102 с.
В особо тяжёлых случаях 4,08 с.

Движок Innodb.
Среднее время 11,1 с.
В особо тяжёлых случаях 120 с.

2 Случай. С множественными операторами Inner Join.
(Выборка в обоих случаях одинаковая, проверял.)

Движок Myisam
Среднее время 0,953с.
В особо тяжёлых случаях 8,75 с.


Движок Innodb.
Среднее время 5,8 с.
В особо тяжёлых случаях 28,59 с.


По результатам тестов, на движке Innodb выборка с множественными операторами Inner Join работает быстрее. Но всё равно быстродействие движка Innodb просто катастрофичное.
Кто-нибудь может подсказать, почему так?
Что ещё можно сделать ля увеличения быстродействия?
...
Рейтинг: 0 / 0
21.02.2016, 01:47:50
    #39176344
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Ovold,

А что у вас с индексами? Покажите полный DDL таблицы и план запроса с Join-ами.
...
Рейтинг: 0 / 0
21.02.2016, 23:17:14
    #39176547
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ускорить select на пересечение множеств?
Ovold Но всё равно быстродействие движка Innodb просто катастрофичное.
Кто-нибудь может подсказать, почему так?
Что ещё можно сделать ля увеличения быстродействия?

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


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