Mysql select 按日期分区时自动递增主键
Mysql select by auto increment primary key while partitioned by date
我想知道如果我按 日期 对 table 进行分区,然后有一些 [=27=,mysql 会如何操作] 或 update 查询 primary key ?
它会搜索所有分区还是查询优化器知道该行保存在哪个分区中?
其他唯一和非唯一索引列呢?
背景
将 PARTITIONed
table 视为实际上独立的 table 的集合,每个都有自己的数据 BTree 和索引 BTree。
所有 UNIQUE
键,包括 PRIMARY KEY
必须包含“分区键”。
如果分区键在查询中可用,查询将首先尝试进行“分区修剪”以限制实际查看的分区数。如果没有该信息,它必须查看所有分区。
“修剪”后,处理会转到每个可能的分区,并执行查询。
Select,更新
A SELECT
逻辑上对在 non-pruned 分区中找到的任何内容执行 UNION ALL
。
UPDATE
将其操作应用于每个 non-pruned 分区。什么都不做的更新不会造成任何伤害(性能除外)。
意见
根据我的经验,PARTITIONing
经常会因为上述原因而减慢速度。分区有少量用例:http://mysql.rjweb.org/doc.php/partitionmaint
您的具体问题
partition a table by date and then have some select or update queries by primary key ?
将触及所有分区。 SELECT
将一个结果与 N-1 个空结果组合在一起。 UPDATE
将进行一次更新,加上 N-1 次无用的更新尝试。
一个AUTO_INCREMENT
列必须是一些索引中的第一列(不一定是PK,不一定是单独的)。因此,在每个分区 中使用id 是非常有效的。但这意味着它是 non-partitioned table 中 N 倍的努力。 (这是分区的性能拖动。)
我想知道如果我按 日期 对 table 进行分区,然后有一些 [=27=,mysql 会如何操作] 或 update 查询 primary key ?
它会搜索所有分区还是查询优化器知道该行保存在哪个分区中?
其他唯一和非唯一索引列呢?
背景
将 PARTITIONed
table 视为实际上独立的 table 的集合,每个都有自己的数据 BTree 和索引 BTree。
所有 UNIQUE
键,包括 PRIMARY KEY
必须包含“分区键”。
如果分区键在查询中可用,查询将首先尝试进行“分区修剪”以限制实际查看的分区数。如果没有该信息,它必须查看所有分区。
“修剪”后,处理会转到每个可能的分区,并执行查询。
Select,更新
A SELECT
逻辑上对在 non-pruned 分区中找到的任何内容执行 UNION ALL
。
UPDATE
将其操作应用于每个 non-pruned 分区。什么都不做的更新不会造成任何伤害(性能除外)。
意见
根据我的经验,PARTITIONing
经常会因为上述原因而减慢速度。分区有少量用例:http://mysql.rjweb.org/doc.php/partitionmaint
您的具体问题
partition a table by date and then have some select or update queries by primary key ?
将触及所有分区。 SELECT
将一个结果与 N-1 个空结果组合在一起。 UPDATE
将进行一次更新,加上 N-1 次无用的更新尝试。
一个AUTO_INCREMENT
列必须是一些索引中的第一列(不一定是PK,不一定是单独的)。因此,在每个分区 中使用id 是非常有效的。但这意味着它是 non-partitioned table 中 N 倍的努力。 (这是分区的性能拖动。)