使用mysql按自动增量字段分区,如何保证insert/load data语句只访问指定的分区?

9rygscc1  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(465)

一般情况
我想知道,当插入非平衡 RANGE -分区mysql表 AUTO INCREMENT 主键,我的插入是否导致mysql以任何方式与我指定的分区以外的分区通信。这有助于预算未来大规模数据加载的容量;有了这个保证,我可以更准确地预测将数据加载到数据库的性能和硬件资源成本。
我正在使用MySQL5.6。
特定上下文
假设我在mysql(5.6)中有下表:

CREATE TABLE foo (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data` varchar(6) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=9001 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
/*!12345 PARTITION BY RANGE (id)
(PARTITION cold VALUES LESS THAN (8000) ENGINE = InnoDB,
 PARTITION hot VALUES LESS THAN (9000) ENGINE = InnoDB,
 PARTITION overflow VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */

假设表不是稀疏的:没有删除任何行,所以 count(*) = max(id) = 9001 .
问题
如果我这样做了 INSERT INTO foo (data) PARTITION (hot) VALUES ('') 或同等产品 LOAD DATAPARTITION 子句中,是否有所选分区以外的分区 hot 正在访问分区?
我如何判断那些dml语句正在访问哪些分区?
我试过的
关于分区选择的mysql文档说:
replace和insert现在只锁定那些具有要插入或替换的行的分区。但是,如果为任何分区列生成自动增量值,则所有分区都将被锁定。
此外,它还说:
不能删减load data语句对分区表施加的锁。
这些语句无助于澄清dml查询正在访问哪些分区,dml查询显式地指定了分区。
我试过了 EXPLAIN PARTITIONS INSERT INTO foo ... ,但是 partitions 输出的列总是 NULL .

s4chpxco

s4chpxco1#

根据文件,
对于插入行的语句,行为的不同之处在于,找不到合适的分区会导致语句失败。insert和replace语句都是这样
因此,当您尝试插入与指定分区不匹配的行时,您将收到
错误代码:1748。找到与给定分区集不匹配的行
这包括一些行匹配的语句和一些不匹配的语句,因此不能使用它来填充“hot”并丢弃将进入“overflow”的行(因为整个查询将失败)。
这个 explain -MySQL5.6的otuput不包含单独的 insert ; 的值 partition 与您插入的数据源相关(例如,在您使用 insert ... select ... partition ... ),即使您使用 values() (然后使用“no table”,相关的分区就是 null ). 对于mysql 5.7+,有一个“insert”类型,它实际上只列出指定的分区。

相关问题