MySQL и правильная настройка разделов
Все наши клиенты являются частью одной и той же базы данных, где мы храним все их изображения, сообщения в блогах и т. Д. Я хочу разделить таблицы, чтобы оптимизировать производительность для каждого из их сайтов (определяется как "site_id" в каждой таблице).,
В качестве примера, давайте использовать наши images
Таблица. Доступны следующие столбцы: image_id (int, primary, auto_inc), site_id (int, primary), width (int), height (int), filesize (int), загруженный (datetime).
Я пытался просто добавить разделение; ALTER TABLE images PARTITION BY KEY(image_id,site_id)
, который работал. Однако у меня нет возможности узнать, что MySQL использует для "группировки" разделов - оптимизирован ли он для того, что я хочу? Вот где вы, ребята, заходите.
Вопрос 1
Является ли PARTITION BY KEY правильным способом настройки раздела, чтобы разделить site_id друг от друга? Если нет - как бы вы это сделали?
вопрос 2
Я видел, что люди вручную добавляют разделы - p0, p1, p2, p3 и т. Д. Вам нужно указать количество разделов, или MySQL "понимает", что я за site_id?
2 ответа
Вопрос 1
Если вы используете раздел по ключу (image_id,site_id), вы не можете быть уверены, что каждый раздел будет содержать только отдельные site_id, потому что этот вид разбиения будет использовать встроенную функцию хеширования для (image_id, site_id) и результат этого будет определяться в разделить строку, в которую будет вставлен.
Если вы хотите обеспечить разделение, вы должны использовать разделение RANGE или LIST.
вопрос 2
Если вы используете разделение RANGE или LIST, вам нужно определить количество разделов, которое вы хотите. т.е.
PARTITION BY RANGE (site_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
);
LIST и RANGE требуют небольшого обслуживания. Если новый site_id добавлен / удален, вам придется адаптировать схему разделов.
Разделение KEY обеспечит сбалансированное перераспределение строк по числу указанных разделов:
PARTITION BY KEY(image_id,site_id)
PARTITIONS 10;
Надеюсь, поможет.
Разделы MySQL - это нормальный способ, но, похоже, у вас также есть идеальный случай для разделения вашей базы данных. Есть простые способы сделать это самостоятельно для простого варианта использования, как этот, и более автоматизированные продукты, которые могут это сделать. Таким образом, вы не ограничены одним сервером, вы можете расширять кластер по мере увеличения его использования и даже можете специально распределять ключи site_id для конкретных серверов (отдавая предпочтение более крупным клиентам). Например, действительно крупный клиент может иметь свой собственный сервер сегмента, тогда множество мелких клиентов могут быть размещены на одном или нескольких других серверах. Если у вас есть общие таблицы, есть способы реплицировать глобальные таблицы на все сегменты. Параллельные запросы могут поддерживаться, если вам нужен доступ к данным всех клиентов.