|
|
|
Оптимизация запроса на большой таблице ~ 40 GB
|
|||
|---|---|---|---|
|
#18+
Добрый день, друзья! Есть таблица - 300 млн строк и размером ~40 GB Простая структура [owner_id, Artist, Title] (список песен пользователей) Нужно выбрать количество сопадений по песням (Artist+Title) для заданного пользователя @user_id со всеми остальными и вывести в формате [user_id:кол-во_совпадений] На данный момент запрос такой: SELECT d2.owner_id, COUNT(*) AS kolvo FROM data d1 JOIN data d2 USING(Artist,Title) WHERE d1.owner_id = @user_id GROUP BY d1.owner_id Индекы [Artist,Title] и [owner_id], движок InnoDB Но с ростом таблицы пропорционально увеличивается время выполнения запроса и на данный момент он выполняется около минуты Есть ли идеи как оптимизировать данную задачу на программном уровне? Заранее большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2016, 10:50 |
|
||
|
Оптимизация запроса на большой таблице ~ 40 GB
|
|||
|---|---|---|---|
|
#18+
Serious CatНа данный момент запрос такой: SELECT d2.owner_id, COUNT(*) AS kolvo FROM data d1 JOIN data d2 USING(Artist,Title) WHERE d1.owner_id = @user_id GROUP BY d1.owner_idизвините за мой французский, начешуя? Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2016, 11:53 |
|
||
|
Оптимизация запроса на большой таблице ~ 40 GB
|
|||
|---|---|---|---|
|
#18+
или вам для каждого юзера надо получить совпадения со всеми остальными ? ну так тогда от фулскана(индексов, но они у вас тоже немаленькие) вам не уйти, как ни старайтесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2016, 11:55 |
|
||
|
Оптимизация запроса на большой таблице ~ 40 GB
|
|||
|---|---|---|---|
|
#18+
tanglir, да, именно со всеми остальными... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2016, 14:14 |
|
||
|
Оптимизация запроса на большой таблице ~ 40 GB
|
|||
|---|---|---|---|
|
#18+
Serious Cat, хз, вроде бы оптимизировать уже нечего. Разве что... В групбае у вас опечатка или ошибка? По смыслу запроса должно быть d2.owner_id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2016, 05:30 |
|
||
|
Оптимизация запроса на большой таблице ~ 40 GB
|
|||
|---|---|---|---|
|
#18+
tanglirSerious CatНа данный момент запрос такой: SELECT d2.owner_id, COUNT(*) AS kolvo FROM data d1 JOIN data d2 USING(Artist,Title) WHERE d1.owner_id = @user_id GROUP BY d1.owner_idизвините за мой французский, начешуя? Код: sql 1. 2. 3. запросы неверные, оба. первый почти правильный, нужен count distinct и правильная группировка. Правильная группировка заключается в том, что группировки вообще не нужно. distinct возможно тоже не нужен в зависимости от того, какие совпадения считаем - у данного пользователя (нужен) или у других пользователей (не нужен). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 11:44 |
|
||
|
Оптимизация запроса на большой таблице ~ 40 GB
|
|||
|---|---|---|---|
|
#18+
MasterZiv, да, для оптимального выполнения нужно два индекса, по owner, и по (artist, title) при этом это будет потолок, лучше уже не будет. хотя, если нужны дубликаты данного пользователя, можно чутка улучшить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2016, 11:47 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39272941&tid=1831576]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 461ms |

| 0 / 0 |
