一般情况
我想知道,当插入非平衡 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 DATA
与 PARTITION
子句中,是否有所选分区以外的分区 hot
正在访问分区?
我如何判断那些dml语句正在访问哪些分区?
我试过的
关于分区选择的mysql文档说:
replace和insert现在只锁定那些具有要插入或替换的行的分区。但是,如果为任何分区列生成自动增量值,则所有分区都将被锁定。
此外,它还说:
不能删减load data语句对分区表施加的锁。
这些语句无助于澄清dml查询正在访问哪些分区,dml查询显式地指定了分区。
我试过了 EXPLAIN PARTITIONS INSERT INTO foo ...
,但是 partitions
输出的列总是 NULL
.
1条答案
按热度按时间s4chpxco1#
根据文件,
对于插入行的语句,行为的不同之处在于,找不到合适的分区会导致语句失败。insert和replace语句都是这样
因此,当您尝试插入与指定分区不匹配的行时,您将收到
错误代码:1748。找到与给定分区集不匹配的行
这包括一些行匹配的语句和一些不匹配的语句,因此不能使用它来填充“hot”并丢弃将进入“overflow”的行(因为整个查询将失败)。
这个
explain
-MySQL5.6的otuput不包含单独的insert
; 的值partition
与您插入的数据源相关(例如,在您使用insert ... select ... partition ...
),即使您使用values()
(然后使用“no table”,相关的分区就是null
). 对于mysql 5.7+,有一个“insert”类型,它实际上只列出指定的分区。