PARTITION BY HASH
практически бесполезен.Я не ожидаю, что это поможет вам как с 100 разделами, так и с 1000.
Вы получаете больше отдачи от вложенных средств, если в качестве первого столбца в PRIMARY KEY
.
получите
venue_id
.
Всегда ли в запросе указан один venue_id
?(Если опции не запутываются.) На данный момент, я предполагаю, что у вас всегда есть WHERE venue_id = constant
.
У вас проблема с многомерной индексацией.INDEXes
- только одно измерение, поэтому все становится сложнее.Тем не менее, разделение можно использовать для сортировки, чтобы получить двумерный индекс.
Давайте выберем day_epoch
в качестве ключа разделения и используем PARTITION BY RANGE(day_epoch)
.(Если вы измените его с 4-байтового INT на 3-байтовую DATE, тогда используйте PARTITION BY RANGE(TO_DAYS(day_epoch))
).
Тогда давайте определимся с PRIMARY KEY
.Примечание: при добавлении или удалении разметки ПК следует переосмыслить.Имейте в виду, что PK - это уникальный индекс.И данные кластеризованы на ПК.(Однако уникальность не гарантируется для всех разделов.)
Итак ...
PARTITION BY RANGE(day_epoch)
PRIMARY KEY(venue_id, zone_id, id) -- in this order
Без разбиения я рекомендую
PRIMARY KEY(venue_id, zone_id, day_epoch, id)
В общем, любой индекс (включая PK) должен начинаться с любого столбца (столбцов), которые проверены с =
.Затем IN
, затем не более одного «диапазона».
Ради требования уникальности PK я поставил id
last .
Таким образом, запрос выполняет что-то вроде этого:
- "Обрезка раздела" - возможно, до одного раздела, основанного на дате.
- Разверните PK непосредственно до последовательногостроки для одного
venue_id
в вопросе. - Hopscotch по данным, основанным на zone_ids.(В некоторых ситуациях это может быть сканирование диапазона вместо прыжка вокруг. Это зависит от версии, количества идентификаторов, значений идентификаторов и, возможно, фазы луны.
- (Если это делаетэто так далеко) Затем получите желаемую дату.
При извлечении большого количества строк из огромной таблицы самое важное - минимизировать попадания на диск. То, что я только что описал, вероятно, делает работу лучше, чем другиеситуации. Разделение на venue_id помогает только с этим одним столбцом, но не помогает с остальными.