|
|
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Привет, можно ли что-то сделать в данном случае: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Пробовал индексы Код: sql 1. 2. 3. 4. 5. 6. Самый оптимальный IDX_fh_analytics_file__user_id__user_file_id__date отрабатывает за 10 секунд, остальные за 40+ смущает using where в эксплейне Код: sql 1. 2. 3. 4. 447681 SELECT COUNT(*) FROm tmp_analytics ta; 119011 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:24:30 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Вот так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. запрос отрабатывает за 2 секунды, что вполне удовлетворяет, но фильтр по дате тоже необходим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:31:14 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Хотя нет, вру, что с датой, что без даты, одинаково работает. Не на той базе запустил просто... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:35:20 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Hettсмущает using where в эксплейнеавторUsing where A WHERE clause is used to restrict which rows to match against the next table or send to the client. Unless you specifically intend to fetch or examine all rows from the table, you may have something wrong in your query if the Extra value is not Using where and the table join type is ALL or index. Even if you are using an index for all parts of a WHERE clause, you may see Using where if the column can be NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:36:41 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
user_file_id, date, user_id - NOT NULL как понимаю он индекс не может этот использовать для фильтрации по всем критериям, к тому же там 2 отсечения (или как их назвать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:40:02 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Hett, а там только using where? using index дальше нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:45:19 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
неа, на картинке в первом посте эксплейн по этому индексу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:51:38 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
а ничего что не все поля участвуют в группировке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 11:29:48 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
все и не надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:16:46 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Hett, эти индексы должны были бы помогать (любой из них): INDEX my_table__idx (date, user_id), INDEX UK_fh_analytics_file1 (user_id, date, user_file_id), INDEX UK_fh_analytics_file2 (date, user_id, user_file_id) НО с 447681 строками для агрегирования всё равно будет тяжко, это много. Т.е. индексы всё равно нужны (один из трёх выше ) чтобы из 9 млн отбирать поллимона, но это всё равно много записей. ЕЩё: сколько уникальных analytics.user_file_id в выборке ? если много -- вообще труба. У тебя нет группировки по analytics.is_deleted , а надо бы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:29:19 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Hettuser_file_id, date, user_id - NOT NULL как понимаю он индекс не может этот использовать для фильтрации по всем критериям, к тому же там 2 отсечения (или как их назвать) Может. Но видимо просто по поводу того, что 1/20 примерно от таблицы выбирается, сервер не хочет использовать индекс. Причём это может быть как хорошо, так и плохо -- надо смотреть реальные косты выполнения. Если индекс таки выгоден -- форсить его хинтами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:32:12 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
1. уникальных user_file_id 6458354 в этой базе (на деве все хуже) 2. c is_deleted там какой-то и правда логический косяк, но это уже не мое. Хотя возможно конечный результат верный, если берется последнее значение, группировка по этому полю разве что-то даст? Да, я чет самое главное не написал, простите. Раньше был индекс user_id,date и все более-менее работало, пока не сделали партицирование PARTITION BY RANGE (MONTH(date)) 12 партиций. После этого и начались тормоза, причем не важно сколько данных попадают под выборку, даже если для юзера записей нет, запрос все равно работал 40 секунд. Индекс IDX_fh_analytics_file__user_id__user_file_id__date по крайней мере не обладает такой проблемой (у него прямая зависимость времени работы запроса от количества данных) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:42:06 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
MasterZivфорсить его хинтами. Это как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:43:04 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Hett1. уникальных user_file_id 6458354 в этой базе (на деве все хуже) ВАЖНО: именно С ЭТИМ УСЛОВИЕМ, а не вообще! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:43:37 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
HettMasterZivфорсить его хинтами. Это как? FORCE INDEX (...), ты же сам писал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:44:12 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
В девелоперской таблице, кстать, 32 млн записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:44:48 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
MasterZivHett1. уникальных user_file_id 6458354 в этой базе (на деве все хуже) ВАЖНО: именно С ЭТИМ УСЛОВИЕМ, а не вообще! ну тогда их число равно количеству данных после группировки 119011 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:45:56 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
MasterZivHettпропущено... Это как? FORCE INDEX (...), ты же сам писал... слово "хинты" смутило ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:46:15 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
HettPARTITION BY RANGE (MONTH(date)) 12 партиций. После этого и начались тормоза, причем не важно сколько данных попадают под выборку, даже если для юзера записей нет, запрос все равно работал 40 секунд. Это мало партиций. Ну ладно, допустим -- покатит... Тебе надо чтобы partition pruning заработал, для этого надо в WHERE писать условие, чтобы содержало MONTH(date), чтобы сразу отсекались ненужные партиции. Т.е. к AND analytics.date >= '2014-03-14' AND analytics.date < '2015-04-13' + INTERVAL 1 DAY надо ещё отельно условия на MONTH(date) прописывать, если это возможно по логике запроса. Если нет -- ты УВЕЛИЧИЛ таким образом время выполнения на порядок ( в 12 раз, если быть точным). Так что ж ты хочешь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:47:50 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
HettMasterZivпропущено... ВАЖНО: именно С ЭТИМ УСЛОВИЕМ, а не вообще! ну тогда их число равно количеству данных после группировки 119011 ? Да, логично, эт я что-то тормознул... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:48:25 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
MasterZivЕсли нет -- ты УВЕЛИЧИЛ таким образом время выполнения на порядок ( в 12 раз, если быть точным). Так что ж ты хочешь ? Ну... партиции то стали меньше в 12 раз, по сравнению с исходной таблицей :) попробую в условие добавить месяцы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:50:00 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Хотя если верить документации https://dev.mysql.com/doc/refman/5.1/en/partitioning-pruning.html то partition pruning уже должен заработать, в условии же есть поле по которому осуществляется партицирование ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 13:00:18 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
HettХотя возможно конечный результат верный, если берется последнее значение, группировка по этому полю разве что-то даст?Берётся не последнее, а случайное. Hettпока не сделали партицированиеС этого надо ыло начинать :) HettНу... партиции то стали меньше в 12 раз, по сравнению с исходной таблицей :)Скорость работы индекса (с) - примерно логарифм от количества проиндексированных записей. При партицировании у каждой партиции образуется свой собственный индекс. А теперь сравните log(N) и 12*log(N/12). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 13:00:48 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
HettНу... партиции то стали меньше в 12 раз, по сравнению с исходной таблицей :) А вот, парадокс... То, что партиции в 10 раз стали меньше --- не очень и важно, потому что там логарифмическая зависимость, и эти 10 раз уберутся "на раз". А что теперь тебе придётся обрабатывать 12 таких таблиц и сливать потом результаты -- факт, и это увеличивает объём работы в 12+ раз, если ты не используешь в запросе отсечение ненужных партиций. Про отсечение читай тут: https://dev.mysql.com/doc/refman/5.7/en/partitioning-pruning.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 13:02:52 |
|
||
|
Оптимизация индекса
|
|||
|---|---|---|---|
|
#18+
Hettвсе и не надо... Надо! Сервер не настолько умён, чтобы догадаться, что все записи группы содержать одно и то же значение в негруппируемом поле. Как итог - при построении суммарной комбинации полей группировки и отбора получается "разрыв", и индекс используется неэффективно - вместо простого выбора по индексу начинается сканирование значений таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 13:03:38 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=139&tid=1833301]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
4ms |
| others: | 203ms |
| total: | 330ms |

| 0 / 0 |
