powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как ускорить select на пересечение множеств?
13 сообщений из 13, страница 1 из 1
Как ускорить select на пересечение множеств?
    #39169138
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

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

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

...и на всякий пожарный еше и реальный селект,
а то на SELECT * ... GROUP BY у некоторых
тут аллергия...
...
Рейтинг: 0 / 0
Как ускорить select на пересечение множеств?
    #39169242
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если максимальное количество литералов в группе невелико, то для каждого возможного количества литералов в группе значений поиска создать свой запрос, использующий соответствующее количество копий исходной таблицы с пре-JOIN отбором. Объединение можно сделать в рамках ХП, либо использовать динамическое формирование текста запроса.
...
Рейтинг: 0 / 0
Как ускорить select на пересечение множеств?
    #39169324
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как ускорить select на пересечение множеств?
    #39169796
Ovold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за некоторые идеи.

Я покачто не совсем понимаю сам механизм поиска пересечения множеств, как он работает в 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
Как ускорить select на пересечение множеств?
    #39169843
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как ускорить select на пересечение множеств?
    #39169847
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку все связывания внутренние, перенос предотбора в ON не имеет смысла. Хотя можно попробовать STRAIGHT_JOIN, если есть заведомо более узкий, чем остальные, фильтр.
...
Рейтинг: 0 / 0
Как ускорить select на пересечение множеств?
    #39170940
Ovold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как ускорить select на пересечение множеств?
    #39170941
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ovold,

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

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

3. озвучте время которое вас бы устроило.
...
Рейтинг: 0 / 0
Как ускорить select на пересечение множеств?
    #39176339
Ovold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Протестировал 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
Как ускорить select на пересечение множеств?
    #39176344
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ovold,

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

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


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