【问题标题】:How to access / query a database partition in mysql?如何访问/查询mysql中的数据库分区?
【发布时间】:2012-04-05 20:27:25
【问题描述】:

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

编辑

回应@Crack 的评论。

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

【问题讨论】:

  • 我不明白你的问题 - 分区是一个存储细节,对用户透明地完成。你像往常一样查询你的分区表。
  • @Crack - 也许你不明白我的问题,因为我对这个话题还很陌生,所以很抱歉我沟通得不够好。请查看我的编辑。

标签: mysql database database-partitioning


【解决方案1】:

好的,让我们一次一个地完成。

所以当一个分区在表中就位时,我仍然会使用普通查询。

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

在查询的数据库端,“修剪”从何而来?是不是非常复杂的存储 Where 子句适用于每个查询?

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

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

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

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

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

【讨论】:

  • 如果是存储的where子句,在数据库中使用存储子句与查询中使用where子句在性能上有区别吗?
  • 我更新了我的答案。它是一种 WHERE 子句,它将您的数据(因为它被存储)分成单独的箱。它们可以在单独的驱动器上,可以同时扫描,在全表扫描中可能会省略一些等。这是一种通过操纵数据存储方式来提高性能的方法。
【解决方案2】:

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

例如,假设我已通过 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 次(让我们暂时忽略散列开销)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多