order by(id, string_field) partition by MM(date)
В этом таблице хранятся какие-то данные, мне нужно сделать такую выборку
where string_field = 'asd' and date < some_date and date > some_date2 AND my_id = 1
Проблема в том, что добавление условия по my_id заставляет сканить данные выбранные по date и string_field в памяти и потом только фильтовать по my_id
Можно ли добавить индекс/сделать какую-то другую оптимизацию ? Буду благодарен за помощь!
Так же еще интересует вопрос, почему при изменении с my_id = 1 на my_id in (1) начинает сканиться ВСЯ таблица ?
Спасибо!
про какой КХ речь? my_id in (1) и my_id in (select 1) сейчас вроде одинаково работают. >Проблема в том, что добавление условия по my_id заставляет сканить данные выбранные по date и string_field в памяти и потом только >фильтовать по my_id почему в памяти? прунинг отсекает партиции date < some_date and date > some_date2 индекс использовать нельзя, не подходит он поэтому сканируются после прунинга партиции my_id = 1 А как еще? раз у вас my_id не в индексе?
кх 20.3 когда указано my_id =1 то в трейсе пишется, что этот кондишн переносится в prewhere и все работает +- норм // занимает < 1gb если указать my_id in (1) то никакой информации об этом нет и вся партиция переносится в память и потом отваливается по лимиту. // limit 10gb > раз у вас my_id не в индексе? мне интересно, есть ли какой-нибудь возможный варик оптимизации
ну так так и пишите select ... from ... prewhere my_id in (1) where string_field = 'asd' and date < some_date and date > some_date2 оптимизатор тупой и не понимает что my_id in (1) лучше перенести
спасибо, думаю так и сделаю. а про условие скана партиции и потом фильтрации по полю my_id особо ничего не придумаешь ?
попробуйте объяснить другими словами. Я вас не понимаю.
у меня есть таблица, партиционированная по дате мне нужно сделать выборку по полю, которое не находится в order by и partition by можно ли как-то получить данные вместо скана всей партиции и последщуюей фильтрации, а прочитать сразу нужные мне данные, например, добавив какой-нибудь сторонний индекс ?
иногда (ну очень редко) помогают skip index. Т.е. например вам надо всегда my_id=1 и =1 бывает очень редко, можно сделать index в котором будут только my_id=1. Если нужны любые my_id, их очень много разных , и они размазаны ровным слоем по таблице, то с вероятностью 1/1млн. может помочь skip_index bloom_filter. Я не использую skip index, делаю дополнительные таблицы, которые по сути являются инверсными индексами
супер, спасибо! ❤️ думал тоже про еще одну таблицу, но сомневался)
Обсуждают сегодня