我在想,如果我按日期划分一个表,然后按主键进行一些选择或更新查询,mysql会怎么做呢?
它是要搜索所有分区还是查询优化器知道在哪个分区中保存行?
其他唯一的而不是唯一的索引列呢?
发布于 2020-08-19 17:45:01
背景
将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列必须是某些索引中的第一列(不一定是PK,也不一定是单独的)。因此,在每个分区中使用id是非常有效的。但这意味着它的工作量是非分区表的N倍。(这是分区的性能拖放。)
https://stackoverflow.com/questions/63487187
复制相似问题