MySQL按日期自动分区时按自动递增主键进行选择

问题描述

我想知道如果我通过 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倍。 (这是用于分区的性能拖动。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...