Является ли уникальный индекс обязательным для разделения таблицы MySQL? - PullRequest
1 голос
/ 02 марта 2020

Я хотел бы добавить раздел (к 2020 году, 2021, 2022 и т. Д. c.) В таблицу "cns_dv c":

+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| id_dvc                | bigint(20)    | NO   |     | NULL    |       |
| dvc                   | varchar(50)   | NO   | MUL | NULL    |       |
| zone                  | varchar(10)   | YES  |     | NULL    |       |
| date_str              | varchar(50)   | YES  |     | NULL    |       |
| date_prs              | varchar(50)   | YES  |     | NULL    |       |
| external_id           | int(11)       | YES  |     | NULL    |       |
| no_week               | int(6)        | YES  |     | NULL    |       |
| day                   | varchar(30)   | NO   |     | NULL    |       |
| pg_avg                | decimal(6,3)  | YES  |     | NULL    |       |
| i_spd_avg             | decimal(15,3) | YES  |     | NULL    |       |
| o_spd_avg             | decimal(15,3) | YES  |     | NULL    |       |
| year                  | int(4)        | NO   | MUL | NULL    |       |
| month                 | tinyint(6)    | YES  | MUL | NULL    |       |
| month_year            | date          | YES  |     | NULL    |       |
| date_cns              | datetime      | YES  |     | NULL    |       |
+-----------------------+---------------+------+-----+---------+-------+

Найти индексы для предыдущая таблица:

+--------------+------------+------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table        | Non_unique | Key_name               | Seq_in_index | Column_name  | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------+------------+------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| cns_dvc      |          0 | dvc                    |            1 | dvc          | A         |       33847 |     NULL | NULL   |      | BTREE      |         |               |
| cns_dvc      |          0 | dvc                    |            2 | date_str     | A         |     4264740 |     NULL | NULL   | YES  | BTREE      |         |               |
| cns_dvc      |          0 | dvc                    |            3 | pg_avg       | A         |     4264740 |     NULL | NULL   | YES  | BTREE      |         |               |
| cns_dvc      |          0 | uidx_dvc_date_cns      |            1 | dvc          | A         |        7084 |     NULL | NULL   |      | BTREE      |         |               |
| cns_dvc      |          0 | uidx_dvc_date_cns      |            2 | date_cns     | A         |     4264740 |     NULL | NULL   | YES  | BTREE      |         |               |
| cns_dvc      |          1 | month                  |            1 | month        | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| cns_dvc      |          1 | year                   |            1 | year         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+--------------+------------+------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

Когда я пытаюсь добавить некоторые разделы, я получаю следующую ошибку:

ALTER TABLE cns_dvc PARTITION BY RANGE(YEAR(date_cns))( PARTITION p2020 VALUES LESS THAN(2021), PARTITION p2021 VALUES LESS THAN MAXVALUE );
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

Должен ли я добавлять уникальный индекс только для столбца date_cns? Если это так, этот столбец не может быть уникальным. Возможно, тип раздела неправильный?

Редактировать: Показать CREATE TABLE cns_dvc;

+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table        | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| cns_dvc      | CREATE TABLE `cns_dvc` (
  `id_dvc` bigint(20) NOT NULL,
  `dvc` varchar(50) NOT NULL,
  `zone` varchar(10) DEFAULT NULL,
  `date_str` varchar(50) DEFAULT NULL,
  `date_prs` varchar(50) DEFAULT NULL,
  `external_id` int(11) DEFAULT NULL,
  `no_week` int(6) DEFAULT NULL,
  `day` varchar(30) NOT NULL,
  `pg_avg` decimal(6,3) DEFAULT NULL,
  `i_spd_avg` decimal(15,3) DEFAULT NULL,
  `o_spd_avg` decimal(15,3) DEFAULT NULL,
  `year` decimal(15,3) DEFAULT NULL,
  `month` decimal(15,3) DEFAULT NULL,
  `month_year` decimal(15,3) DEFAULT NULL,
  `date_cns` datetime DEFAULT NULL,
  UNIQUE KEY `dvc` (`dvc`,`date_str`,`pg_avg`) USING BTREE,
  UNIQUE KEY `uidx_dvc_date_cns` (`dvc`,`date_cns`),
  KEY `month` (`month`),
  KEY `year` (`year`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

Ответы [ 2 ]

0 голосов
/ 02 марта 2020
  • У вас есть UNIQUE ключи, но у каждого есть хотя бы один NULLable столбец. Таким образом, никто не может быть повышен до PRIMARY KEY.
  • Каждая таблица должна иметь PK. В вашем случае для вас будет сгенерирован скрытый (недоступный) ПК.
  • Зачем нужны два ключа UNIQUE? Часто это ошибка разработки схемы.
  • Не разбивайте таблицу, если в ней не менее миллиона строк.
  • Не ожидайте улучшения производительности, просто разбивая.
  • Используйте разделение, если вам нужно удалить «старые» данные; это то, что вы делаете?
  • «УНИКАЛЬНЫЙ ИНДЕКС должен включать все столбцы в функции разделения таблицы» - это абсолютное требование. (Может быть, через год появятся «глобальные» уникальные ключи.)
  • У вас есть «месяц» в нескольких столбцах с несколькими типами данных; пожалуйста, объясни. Обычно лучше всего очистить даты / даты во время ввода и использовать DATE, DATETIME и / или TIMESTAMP, а не VARCHAR. И я никогда не слышал об использовании DECIMAL!?
  • * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * лучше лучше всего выделить 1031 * в SELECT, чем разбрасывать детали по столбцам.
  • Посмотрим главное SELECTs; мы можем посоветовать, как обеспечить оптимальную индексацию для многораздельных и однораздельных таблиц.
0 голосов
/ 02 марта 2020

Обходной путь, который я сделал, - создать дублирующуюся таблицу без индексов. Я выполнил то же самое SQL, чтобы создание раздела работало (ALTER TABLE cns_dv c PARTITION BY et c.).

Все столбцы, определенные в уникальных индексах таблицы, должны быть частью определения раздела в данном случае это 4 столбца: dv c, date_str, pg_avg, date_cns

Полагаю, мне будет проще снова создать таблицу с разделом. Затем добавьте уникальные индексы на раздел.

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