2012-04-05 114 views
2

当在mysql中对数据库表进行分区时,如何访问/查询单个分区?如何在mysql中访问/查询数据库分区?

编辑

在回应@裂缝的评论。

因此,当一个分区是发生在一个表,然后我仍然会用一个正常的查询。 “修剪”在查询的数据库端到达哪里?这几乎是一个复杂的存储Where子句,然后应用于每个查询?为什么命名的分区如果不能单独访问?

+0

我不明白你的问题 - 分区是一个存储细节,对用户透明地完成。像往常一样查询分区表。 – Crack 2012-04-05 21:03:23

+0

@Crack - 也许你不明白我的问题,因为我对这个话题相当陌生,所以我很抱歉,我的沟通不够好。请参阅我的编辑。 – 2012-04-05 21:08:48

回答

3

好吧,让我们一次一个这个部分。

所以,当一个分区在表中的地方,我仍然会使用正常的查询。

是的。分区对您来说是透明的,它意味着通过划分物理来优化(当使用得很好的时候)查询性能。将数据和索引存储到单独的“容器”中。

“修剪”在查询的数据库端来到哪里?这几乎是一个复杂的存储Where子句,然后应用于每个查询?

是,也不是。根据分区模式,MySQL会将您的数据放入不相关的“容器”中。稍后,它会读取查询的WHERE子句,并知道必须检查哪些分区来回答它。 MySQL文档在文档中有几个很好的例子:Partition Pruning

它允许每个分区存储不同的物理存储设备上,并且MySQL能并行运行的一些操作或根本不扫描一些分区(见上面从链路的例子)。

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

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

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

+0

如果它是存储的where子句,那么在使用数据库中的存储子句时与使用查询中的where子句时性能有差异吗? – 2012-04-05 21:26:05

+0

我更新了我的答案。这是一种WHERE子句,它将数据(存储时)分为不同的数据块。它们可以位于单独的驱动器上,可以同时扫描,也可以在全表扫描等中省略。这是通过操纵数据存储方式来提高性能的一种方式。 – Crack 2012-04-05 21:32:04

3

修剪数据确实会在您插入数据时发挥作用。

例如,假设我已经通过散列对id(整数列)进行了分区,我的散列函数只是检查整数是奇数还是偶数。因此,MySQL将会有效地创建两个bin - odd bineven bin

当我插入id = 1,MySQL的应用散列函数。由于结果为odd,因此数据将存储在odd bin中。当我插入id = 2时,数据将转到even bin

查询不涉及任何修剪,只是一些智能逻辑。 MySQL知道从这个表上引发的查询,如果它只能查看一个分区(在我们的例子中是数据的一半),它可能会提高性能。所以,它试图识别分区。

当一个查询被触发涉及到where中的id列时,MySQL会再次将散列函数应用于传递的值。假设我说WHERE id = 2 AND <some other condition>,散列返回even。所以,现在MySQL只查看even bin

在这个简单的例子中,您可以看到查询/插入数据时,只需要扫描/更新完整数据集的一半,从而将性能有效地提高了约10倍。 2次(让我们现在打折哈希开销)。