Будет ли работать вышеуказанное?
Нет. По нескольким причинам.
Если company_idx
является varchar, вам нужно использовать RANGE COLUMNS
. Разделение RANGE
работает только на целые числа. Если вы попытаетесь использовать RANGE
разбиение на varchar, вы получите эту ошибку:
ERROR 1659 (HY000): Field 'company_idx' is of a not allowed type for this type of partitioning
Если вы исправите это, у вас возникнет другая проблема:
В ваших разделах используются целочисленные значения,не заключенные в кавычки строковые значения. Это разные типы, и механизм разделения не будет использовать их для определения разделов. Если вы попытаетесь, вы увидите эту ошибку:
ERROR 1654 (HY000): Partition column values of incorrect type
Если вы исправите это, заключив в кавычки числа, у вас возникнет другая проблема:
Вы перечислите раздел на 500 перед строкой 1000, но строка '500' должна идти после строки '1000' в лексическом порядке. Разделы RANGE или RANGE COLUMNS должны быть объявлены в возрастающем порядке. Если вы попытаетесь сделать это в том порядке, в котором у вас есть, вы получите эту ошибку:
ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition
Если вы исправите заказ, он работает, но может не работать так, как вы хотите:
CREATE TABLE `companyScores` (
`company_idx` varchar(10) NOT NULL,
PRIMARY KEY (`company_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
/*!50500 PARTITION BY RANGE COLUMNS(company_idx)
(PARTITION p1 VALUES LESS THAN ('1000') ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN ('1500') ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN ('2000') ENGINE = InnoDB,
PARTITION p0 VALUES LESS THAN ('500') ENGINE = InnoDB) */
Теперь еще один вопрос, который вы задали:
Кроме того, можем ли мы легко вставить новые значения в эту базу данных после ее разбиения?
Если вы вставитеновое значение, которое не охватывается определенными вами разделами, вы получите эту ошибку:
mysql> insert into companyScores set company_idx = '700';
ERROR 1526 (HY000): Table has no partition for value from column_list
Почему это так? У вас есть раздел для company_idx меньше 1000, верно?
Нет. У вас есть раздел для company_idx, который меньше string '1000'. Вы попытались вставить string '700', что лексически больше, чем '500', а также все остальные разделы. Поэтому он выходит за рамки любого из определенных разделов.
Вы можете решить все вышеперечисленные проблемы, если измените свой customer_idx на целочисленный столбец.