|
|
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуйста, как ускорить получение пересечения множеств из таблицы? Есть запрос такого вида: 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 записей начинаются лаги. Иногда даже выход за пределы таймаута. Что можно сделать, чтобы выборки пересечения множеств из таблиц происходили побыстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 01:43 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Ovold, ddl покажите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 04:54 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Ovold, ...и на всякий пожарный еше и реальный селект, а то на SELECT * ... GROUP BY у некоторых тут аллергия... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 06:57 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Если максимальное количество литералов в группе невелико, то для каждого возможного количества литералов в группе значений поиска создать свой запрос, использующий соответствующее количество копий исходной таблицы с пре-JOIN отбором. Объединение можно сделать в рамках ХП, либо использовать динамическое формирование текста запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 09:14 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
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-ов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 10:57 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Спасибо за некоторые идеи. Я покачто не совсем понимаю сам механизм поиска пересечения множеств, как он работает в 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 результатов. Требуется найти пересечение этих множеств. Самое разумное решение, что я нашёл, я привёл в первом посте. Но быстродействие слишком низкое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 17:48 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 18:33 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Поскольку все связывания внутренние, перенос предотбора в ON не имеет смысла. Хотя можно попробовать STRAIGHT_JOIN, если есть заведомо более узкий, чем остальные, фильтр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 18:36 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
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; Но работает в разы медленне, чем в том варианте, что я привёл в первом посте. Как бы получить более высокое быстродействие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 02:09 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Ovold, 1. погуглите EXPLAIN и выдайте сюда результаты для все сравниваемых запросов 2. приведите конкретное время выполнения всех сравниваемых запросов. ВЫполнять 3 раза. после SELECT поставьте SQL_NO_CACHE 3. озвучте время которое вас бы устроило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2016, 02:20 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Протестировал 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 просто катастрофичное. Кто-нибудь может подсказать, почему так? Что ещё можно сделать ля увеличения быстродействия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2016, 01:11 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Ovold, А что у вас с индексами? Покажите полный DDL таблицы и план запроса с Join-ами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2016, 01:47 |
|
||
|
Как ускорить select на пересечение множеств?
|
|||
|---|---|---|---|
|
#18+
Ovold Но всё равно быстродействие движка Innodb просто катастрофичное. Кто-нибудь может подсказать, почему так? Что ещё можно сделать ля увеличения быстродействия? потому что не настроен сервер. соответственно, надо настроить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2016, 23:17 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39169138&tid=1832123]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
144ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 197ms |
| total: | 435ms |

| 0 / 0 |
