这适用于带有InnoDB的MySQL 5.7。
我有一个分区表,我将按分区进行批量数据加载(大量数据)。即我知道我加载的每批数据都将专属于一个分区。
现在,处理带有数据加载的索引的常用方法(据我所知)将首先删除所有索引,进行数据加载,然后重新创建索引。
但是我想知道,因为我是通过分区加载的,这仍然是最优化的方式(删除然后重新创建索引),因为看起来我不必要地“触摸”未更新的分区方式。
e.g。
在这种情况下,我应该预先创建索引并在加载数据时将它们保留在那里吗?
(顺便说一下,不要担心查询。数据加载时数据库处于“离线”状态。此处的目的只是缩短每批数据加载的时间。)
表模式如下:
CREATE TABLE MYTABLE (
ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
YEAR SMALLINT UNSIGNED NOT NULL,
MONTH TINYINT UNSIGNED NOT NULL,
A CHAR(4),
B VARCHAR(127),
C VARCHAR(15),
D VARCHAR(511),
E TEXT,
F TEXT,
G VARCHAR(127),
H VARCHAR(127),
I VARCHAR(127),
J VARCHAR(511),
K VARCHAR(511),
L BIT(1),
CONSTRAINT PKEY PRIMARY KEY (ID, YEAR, MONTH)
)
PARTITION BY LIST COLUMNS(YEAR, MONTH) (
PARTITION PART1 VALUES IN ((2007, 1)),
PARTITION PART2 VALUES IN ((2007, 2)),
PARTITION PART3 VALUES IN ((2007, 3)),
...
);
当然,还有一堆索引(总共14个),大多数涉及2到4列。 2 TEXT
列中没有一列属于任何索引。
答案 0 :(得分:2)
如果您使用的是InnoDB,请不要删除PRIMARY KEY
。
所有PARTITIONs
始终具有相同的索引。因此,您无法单独打开/关闭索引。
请提供SHOW CREATE TABLE
进一步的批评和建议。我可能说PARTITIONing
没用;使用PARTITION
值得使用的用例非常少。 More info, and use cases