问题描述
我想知道如果我通过 date 对表进行分区,然后通过进行一些 select 或 update 查询,那么MysqL将如何操作?主键?
其他唯一索引和非唯一索引列又如何呢?
解决方法
背景
将PARTITIONed
表视为实际上独立的表的集合,每个表都有自己的数据BTree和索引BTree。
所有UNIQUE
键,包括PRIMARY KEY
必须包含“分区键”。
如果查询中有分区键,则查询将首先尝试执行“分区修剪”以限制实际查看的分区数。没有该信息,它必须查看所有分区。
“修剪”之后,处理将转到每个可能的分区,并执行查询。
选择,更新
在逻辑上,SELECT
对未修剪分区中发现的内容进行UNION ALL
。
UPDATE
将其操作应用于每个未修剪的分区。不执行任何操作的更新不会对性能造成任何损害(性能除外)。
意见
根据我的经验,由于上述原因,PARTITIONing
通常会使事情变慢。有少量的分区用例:http://mysql.rjweb.org/doc.php/partitionmaint
您的具体问题
按日期对表进行分区,然后通过主键进行一些选择或更新查询?
将触摸所有分区。 SELECT
将一个结果与N-1个空结果合并。 UPDATE
将进行一次更新,再进行N-1次无用的更新。
AUTO_INCREMENT
列必须是 some 索引中的第一列(不一定是PK,不一定是单独的)。因此,在每个分区中使用id都是非常有效的。但这意味着它的工作量是未分区表的N倍。 (这是用于分区的性能拖动。)