3

当一个数据库表在mysql中已经分区后,各个分区是如何访问/查询的?

编辑

回应@Crack 的评论。

因此,当表中存在分区时,我仍然会使用普通查询。在查询的数据库端,“修剪”从何而来?Where那么它是应用于每个查询的复杂存储子句吗?如果不单独访问分区,为什么要命名分区?

4

2 回答 2

4

好的,让我们一次一个地处理这个部分。

因此,当表中存在分区时,我仍然会使用普通查询。

是的。分区对您来说是透明的,它旨在通过划分物理来优化(如果使用得当)查询性能。将数据和索引存储到单独的“箱”中。

在查询的数据库端,“修剪”从何而来?那么,它是一个非常复杂的存储 Where 子句,然后应用于每个查询吗?

是和不是。根据分区模式,MySQL 将您的数据放入不相交的“箱”中。稍后它会读取WHERE查询的子句并知道必须检查哪些分区才能回答它。MySQL 文档在文档中有一些很好的示例:Partition Pruning

它允许您将每个分区存储在不同的物理存储设备上,并且 MySQL 可以并行运行一些操作或根本不扫描某些分区(参见上面链接中的示例)。

如果不单独访问分区,为什么要命名分区?

它们是单独访问的,但您无需做出此决定 - 优化器会这样做。分区名称使您更容易管理它们。您可以在文档中找到可能的操作(分区管理)。

从 MySQL 5.6.2 开始,您可以从单个分区中选择数据,请参阅分区选择。只是一个建议 - 如果您不需要,请不要使用此语法,因为使用它会使您的查询绑定到数据的存储结构(并且不要在生产中使用不稳定的 MySQL 版本;)。

于 2012-04-05T21:22:13.373 回答
3

数据的修剪主要在插入数据时发挥作用。

例如,假设我已经通过散列对表进行了分区id- 一个整数列,我的散列函数只是检查整数是否为奇数/偶数。因此,MySQL 将有效地创建两个箱 -odd bineven 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 次(让我们暂时忽略散列开销)。

于 2012-10-15T10:45:03.597 回答