Главное, что нужно понять о PARTITIONing
, это то, что он не по сути обеспечивает какое-либо преимущество в производительности.
Есть несколько исключений. Единственное, что может применяться, это:
Если вы намереваетесь удалить «старые» чаты, скажем, через 30 дней, тогда DELETE
можно сделать более эффективным с помощью DROP PARTITION
.
* 1011. * Больше обсуждений:
http://mysql.rjweb.org/doc.php/partitionmaint Возвращаясь к вашим конкретным c вопросам:
"В каждом чате между двумя пользователями я получаю раздел" - НЕТ! Разметка плохо масштабируется. В целом, механизмы баз данных спроектированы так, чтобы быть эффективными при выполнении вещей DML: выбрать / вставить / удалить / обновить, но за счет вещей DDL: создать / изменить / удалить.
"все они принадлежат «Тот же чат» - звучит как попытка помочь с «кешированием». Большая часть этого может быть достигнута путем тщательного выбора индексов. messages
для данного chat
может быть «кластеризован» вместе с этой техникой в таблице messages
:
CREATE TABLE Messages (
message_id BIGINT NOT NULL AUTO_INCREMENT,
chat_id INT UNSIGNED NOT NULL,
...
PRIMARY KEY(chat_id, message_id), -- to cluster by chat
INDEX(message_id) -- to keep auto_increment happy
) ENGINE=InnoDB;
Почти во всех ситуациях «цель» разделения может быть эмулирована Подходящая схема индексации. (Следствие: нужно пересмотреть индексы при переключении на / из разбиения.)
«1 миллион разделов» - ограничение 8 КБ. И есть, по крайней мере, один диск файл на раздел; Операционные системы не любят иметь миллион файлов, особенно в одном каталоге. Даже 8К растягивает вещи.