SQL-разделение очень большой таблицы - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь разбить мою очень большую таблицу MySQL, которая называется companyScores (60 миллионов строк и 50 столбцов). По сути, в таблице представлены компании (с столбцом varchar "company_idx" с уникальными идентификаторами от 0 до 10 000 компаний) и их соответствующие временные метки (с помощью столбца "временная метка") и баллы "Счета" (с помощью столбца "Счета"). Я хотел бы включить около 500 компаний в каждый раздел. Пожалуйста, дайте мне знать, сработает ли следующее:

ALTER TABLE `companyScores`
PARTITION BY RANGE( company_idx ) (
    PARTITION p0 VALUES LESS THAN (500),
    PARTITION p1 VALUES LESS THAN (1000),
    PARTITION p2 VALUES LESS THAN (1500),
    PARTITION p3 VALUES LESS THAN (2000),
    and so on...
);

Будет ли работать вышеуказанное?

Кроме того, можем ли мы легко вставить новые значения в эту базу данных после ее разбиения?

1 Ответ

1 голос
/ 04 октября 2019

Будет ли работать вышеуказанное?

Нет. По нескольким причинам.

Если 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 на целочисленный столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...