【发布时间】:2016-08-01 03:29:00
【问题描述】:
这适用于带有 InnoDB 的 MySQL 5.7。
我有一个分区表,我将按分区进行批量数据加载(大量数据)。即我知道我加载的每批数据都将完全落入一个分区中。
现在,处理数据加载索引的常用方法(据我所知)是先删除所有索引,进行数据加载,然后重新创建索引。
但我想知道,由于我是按分区加载的,这是否仍然是最佳方式(删除然后重新创建索引),因为我似乎不必要地“触摸”了未更新的分区方式。
例如
- 正在将数据加载到分区 1。
- 删除所有索引 - 没有任何反应,因为还没有数据。
- 加载数据 - 全部进入分区 1。
- 创建索引 - 仅修改分区 1。
- 正在将数据加载到分区 2。
- 删除所有索引 - 删除分区 1 中的所有索引(不必要!)
- 加载数据 - 全部进入分区 2。
- 创建索引 - 重新创建分区 1 索引(不必要!)并创建分区 2 索引。
- 因此,加载第二批数据的时间比第一批要长得多。而且每批都会变得更糟!
在这种情况下,我应该只预先创建索引并在加载数据时将它们保留在那里吗?
(顺便说一句,不用担心查询。数据加载时数据库处于“离线”状态。这里的目的只是为了缩短每批数据加载的时间。)
表架构如下:
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 列都不在任何索引中。
【问题讨论】:
-
InnoDB?
SELECTs是什么样的?您将添加哪些索引? utf8?拆分YEAR和MONTH而不是使用单列DATE真的有益吗?选择会超过一个月吗?你总是使用WHERE year=constant AND month=constant吗?
标签: mysql indexing partitioning