Mysql “错误”;主键必须包括表中的所有列';“s分割函数”;
将列country_id上的分区索引添加到下表时,我得到了错误: 主键必须包括表分区中的所有列 作用 我试图将列country_id添加到包含then id和country_id的PK中。但随后出现类似的错误消息: 唯一键必须包括表分区中的所有列 作用 然后:Mysql “错误”;主键必须包括表中的所有列';“s分割函数”;,mysql,indexing,partitioning,Mysql,Indexing,Partitioning,将列country_id上的分区索引添加到下表时,我得到了错误: 主键必须包括表分区中的所有列 作用 我试图将列country_id添加到包含then id和country_id的PK中。但随后出现类似的错误消息: 唯一键必须包括表分区中的所有列 作用 然后: ALTER TABLE geo.geo_city PARTITION BY RANGE (country_id) ( PARTITION p0 VALUES LESS THAN (2),
ALTER TABLE geo.geo_city PARTITION BY RANGE (country_id) (
PARTITION p0 VALUES LESS THAN (2),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20),
PARTITION p3 VALUES LESS THAN (30),
PARTITION pRemain VALUES LESS THAN MAXVALUE
)
现在该怎么办?试试这个定义:
CREATE TABLE `geo_city` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`country_id` smallint(5) unsigned NOT NULL,
`admin_zone_id` bigint(20) unsigned DEFAULT NULL,
`name` varchar(128) NOT NULL,
`lat` double NOT NULL,
`lng` double NOT NULL,
`population` int(10) unsigned DEFAULT NULL,
`timezone_id` smallint(5) unsigned DEFAULT NULL,
PRIMARY KEY (`id`, country_id),
UNIQUE KEY `idx_unique_city_per_adminzone` (`admin_zone_id`,`name`, country_id),
KEY `name` (`name`),
KEY `idx_lat_lng` (`lat`,`lng`),
KEY `admin_zone_id` (`admin_zone_id`),
KEY `population` (`population`),
KEY `timezone_id` (`timezone_id`)
) ENGINE=InnoDB AUTO_INCREMENT=496831 DEFAULT CHARSET=utf8;
如错误所示,每个唯一的密钥都需要包含
国家/地区id
。注意:我不相信country\u id
真的是分区的好选择,因为国家的大小差异很大。但是,问题不在于特定分区方案的优点。您需要将所有分区键添加到所有主键和唯一键中。分区定义在哪里?刚刚添加,谢谢,您需要将country\u id添加到主键和两个唯一键定义中。您可能会发现按country\u id分区没有任何优势。因为您是按country\u id
分区的,所以将该列放在这两个键的开头是最不有利的。建议将其移到列表的末尾。另外,自动增量
要求id
位于某个索引的开头(它不必是主
,甚至不必是唯一的
)。@RickJames。有没有什么地方可以解释分区键在开始还是结束时更好?这是我开发的一个。如果WHERE
子句有两个条件,则使用一个条件选择分区,然后使用另一个条件在主键或二级索引中获得集群。这对我的工作至关重要。而且,首先使用分区键,分区并不比使用相同索引的非分区表好多少。
CREATE TABLE `geo_city` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`country_id` smallint(5) unsigned NOT NULL,
`admin_zone_id` bigint(20) unsigned DEFAULT NULL,
`name` varchar(128) NOT NULL,
`lat` double NOT NULL,
`lng` double NOT NULL,
`population` int(10) unsigned DEFAULT NULL,
`timezone_id` smallint(5) unsigned DEFAULT NULL,
PRIMARY KEY (`id`, country_id),
UNIQUE KEY `idx_unique_city_per_adminzone` (`admin_zone_id`,`name`, country_id),
KEY `name` (`name`),
KEY `idx_lat_lng` (`lat`,`lng`),
KEY `admin_zone_id` (`admin_zone_id`),
KEY `population` (`population`),
KEY `timezone_id` (`timezone_id`)
) ENGINE=InnoDB AUTO_INCREMENT=496831 DEFAULT CHARSET=utf8;