Задавайте вопросы, мы ответим
Вы не зашли.
Доброго дня, Коллеги!
Ситуация следующая:
mysql 5.7.22 (Linux Ubuntu).
Есть табличка t1, в ней 500 записей
В запросе к ней leftjoin'ится другая табличка t2, у которой окрест 100,000,000 записей.
В t2 PRIMARY KEY (`good_id`,`shop_id`)
При этом поле t2.shop_id - по нему партиционировано.
Запрос [SELECT count(distinct shop_id) FROM t2;] возвращает 480,
Количество записей в t2 для каждого shop_id - варьируется от 20,000 до 500,000.
Сам запрос, который препарирую (самая важная его часть):
Неактивен
Знаю ответ только на вопрос (1). Да, все верно, идет использование индекса на каждой отдельной партиции. Это линейно по числу партиций, а если бы был единый индекс, то сложность была бы логарифмической.
Неактивен
0. У тебя плохой PK. При партиционировании по shop хороший индекс должен бы по нему начинаться.
Если у тебя запросы в основном по товарам, то более правильное разбиение будет по ним, а не по магазинам.
1. Правильно понимаешь!
2. В случае с партиционированием обычно полезно знать 1 или много, это ты умеешь отличать. 300 или 480 — уже без разницы, это в любом случае плохой запрос. Точное количество, скорее всего, не достанешь. И ещё раз — ты не хочешь его знать
3. Тебе это не надо знать. Вот реально. На рабочей системе рабочая скорость как раз прогретая. Если ты хочешь оптимизировать, смотри планы. Если тебе нужно отвечать на вопрос «как оно себя ведёт сразу после перезагрузки сервера», то тогда перезагружай и сразу после — смотри. Все остальные способы не дают ответа на твой вопрос и не добавляют информации. Но, скорее всего, это ты тоже не хочешь
Неактивен
1, 2, 3 - accepted!
На предмет 0:
Есть немалое количество часто используемых запросов, которые идут по магазинам, а не по товарам. Почему партиция и была введена по полю shop_id.
>При партиционировании по shop хороший индекс должен бы по нему начинаться.
А чем непосредственно это будет лучше?
Для, допустим, приведенного в топике запроса?
Что изменится и чем станет лучше если, в t2 в PK поменяем поля местами, то есть сделаем (`shop_id`,`good_id`)?
Неактивен
Это философский вопрос. Партиционирование хорошо только тогда, когда ты всегда (кроме явных агрегатов) бегаешь в одну партицию. А если ты бегаешь только в одну, то и индекс полезен только в правильном порядке (либо надеяться на то, что MySQL сообразит про pruning, и тогда выбросить вообще партиционирование из ключа). А в твоем порядке непонятно, зачем он там — он не может ни для чего использоваться.
Неактивен
Понятно, только количество случаев, когда MySQL не соображает как раз-таки про pruning (хотя по идее должен) что-то велико, судя по stackoverflow :-(.
Да и такие рассказы не прибавляют оптимизма.
Так что иду другим путем - выясняю, что же заставило ввести партицию и стоило ли это делать .
Спасибо всем откликнувшимся!
Неактивен