如何在mysql中访问/查询数据库分区



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

编辑

回应@Crack的评论。

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

好的,让我们一次完成这一部分。

因此,当表中有一个分区时,我仍然会使用普通的查询。

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

在查询的数据库端,"修剪"是从哪里来的?它是不是相当复杂的存储Where子句,应用于每个查询?

是和否。根据分区模式,MySQL将数据放入不相交的"bin"中。稍后,它会读取查询的WHERE子句,并知道必须检查哪些分区才能回答它。MySQL文档中有几个很好的例子:分区修剪。

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

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

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

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

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

例如,假设我在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

在这个微不足道的例子中,您可以看到在查询/插入数据时,只需要扫描/更新整个数据集的一半,从而有效地将我的性能提高了大约2倍(现在我们不考虑哈希开销)。

最新更新