с final извлекающий 10млн строк, у него есть фильтр. В случае селективной фильтрации (убираются почти все строки) запрос работает в разы медленней чем при неселективной фильтрации. Планы запросов одинаковые (кроме фильтра), read_rows, read_bytes тоже одинаковые. Но, потребление памяти у медленного запроса в 2 раза выше.
Выглядит очень странным что фильтрация, которая убрала кучу строк, сделала запросу хуже. При этом все вычисления одинаковые. Может кто сталкивался с таким?
skip index есть? без final также странно ведет?
Без final так же (чуть быстрее, но такая же разница в 2-3раза между запросами). Skip индексов нет.
а возможно в секции select этой колонки нет? -- это нормально тогда. Представьте у вас таблица размером 100ГБ и 99ГБ из них это одна колонка, если этой колонки не касаться то запрос будет быстрым
В обоих запросах фильтр есть и он затрагивает одинаковые колонки. Просто в одном варианте он оказывается более селективным (медленный вариант) чем в другом. Запрос не содержит limit, т.е. всегда придется обойти до конца.
ну хз тогда. Надо смотреть DDL таблицы и запрос
Спасибо! Попробую покопаться в trace_log если разберусь с ним.
Немного раскопал. Деградация производительности происходит когда когда к маленькой таблице джойнится большая. В нашем случае за уменьшение первой таблицы отвечает фильтр. Если условно представить, то выглядит примерно так: Выполняется за 10 секунд. select * from table1 (1млн строк) right join table2 (1млн строк) Выполняется за 30секунд select * from table1 (10тыс строк) right join table2 (1млн строк)
у вас right join у вас всегда table1 джойнится к table2 а limit есть в запросе?
limit нет, точнее я его убрал и разницы нет.
покажите статистику 2х запросов эту : Elapsed: 0.008 sec. Processed 18.19 thousand rows, 317.46 KB (2.17 million rows/s., 37.89 MB/s.)
Селективный и медленный: Elapsed: 48.898 sec. Processed 19.16 million rows, 6.70 GB (391.92 thousand rows/s., 137.01 MB/s.) Неселективный и быстрый: Elapsed: 15.081 sec. Processed 19.18 million rows, 6.71 GB (1.27 million rows/s., 445.11 MB/s.) Первый очень долго висел на 99%, но, кажется это нормально.
ну попробуйте set join_algorithm = 'hash' и выполните запросы
Пробовал, кажется даже все алгоритмы. Разница не очень ощутима.
если на left join переделать и поменять таблицы местами?
То же самое. Попробовал полностью обнулить запрос первой таблицы, стало еще чуть медленней.
Обсуждают сегодня