当一个数据库表在mysql中已经分区后,各个分区是如何访问/查询的?
编辑
回应@Crack 的评论。
因此,当表中存在分区时,我仍然会使用普通查询。在查询的数据库端,“修剪”从何而来?Where
那么它是应用于每个查询的复杂存储子句吗?如果不单独访问分区,为什么要命名分区?
当一个数据库表在mysql中已经分区后,各个分区是如何访问/查询的?
编辑
回应@Crack 的评论。
因此,当表中存在分区时,我仍然会使用普通查询。在查询的数据库端,“修剪”从何而来?Where
那么它是应用于每个查询的复杂存储子句吗?如果不单独访问分区,为什么要命名分区?
好的,让我们一次一个地处理这个部分。
因此,当表中存在分区时,我仍然会使用普通查询。
是的。分区对您来说是透明的,它旨在通过划分物理来优化(如果使用得当)查询性能。将数据和索引存储到单独的“箱”中。
在查询的数据库端,“修剪”从何而来?那么,它是一个非常复杂的存储 Where 子句,然后应用于每个查询吗?
是和不是。根据分区模式,MySQL 将您的数据放入不相交的“箱”中。稍后它会读取WHERE
查询的子句并知道必须检查哪些分区才能回答它。MySQL 文档在文档中有一些很好的示例:Partition Pruning。
它允许您将每个分区存储在不同的物理存储设备上,并且 MySQL 可以并行运行一些操作或根本不扫描某些分区(参见上面链接中的示例)。
如果不单独访问分区,为什么要命名分区?
它们是单独访问的,但您无需做出此决定 - 优化器会这样做。分区名称使您更容易管理它们。您可以在文档中找到可能的操作(分区管理)。
从 MySQL 5.6.2 开始,您可以从单个分区中选择数据,请参阅分区选择。只是一个建议 - 如果您不需要,请不要使用此语法,因为使用它会使您的查询绑定到数据的存储结构(并且不要在生产中使用不稳定的 MySQL 版本;)。
数据的修剪主要在插入数据时发挥作用。
例如,假设我已经通过散列对表进行了分区id
- 一个整数列,我的散列函数只是检查整数是否为奇数/偶数。因此,MySQL 将有效地创建两个箱 -odd bin
和even bin
.
当我 insertid = 1
时,MySQL 应用哈希函数。既然结果是odd
,数据就放在了odd bin
。当我插入id = 2
时,数据会转到even bin
.
查询不涉及任何修剪,只是一些智能逻辑。MySQL 从对该表触发的查询中知道,如果它只能查看一个分区(在我们的例子中是一半的数据),它可能会提高性能。因此,它会尝试识别分区。
当现在触发涉及 a 中的id
列的查询时where
,MySQL 将再次将散列函数应用于传递的值。假设我说WHERE id = 2 AND <some other condition>
,哈希返回even
。所以,现在 MySQL 只查看even bin
.
在这个简单的例子中,你可以看到在查询/插入数据时,只需要扫描/更新整个数据集的一半,有效地提高了我的性能大约。2 次(让我们暂时忽略散列开销)。