当数据库表在mysql中进行分区时,如何访问/查询各个分区?
编辑
回应@Crack的评论。
因此,当表中有一个分区时,我仍然会使用普通的查询。在查询的数据库端,"修剪"是从哪里来的?它是不是相当复杂的存储Where
子句,应用于每个查询?如果分区不是单独访问的,为什么要命名它们?
好的,让我们一次完成这一部分。
因此,当表中有一个分区时,我仍然会使用普通的查询。
是的。分区对您来说是透明的,它旨在通过划分物理分区来优化(如果使用得当)查询性能。将数据和索引存储到单独的"存储箱"中。
在查询的数据库端,"修剪"是从哪里来的?它是不是相当复杂的存储Where子句,应用于每个查询?
是和否。根据分区模式,MySQL将数据放入不相交的"bin"中。稍后,它会读取查询的WHERE
子句,并知道必须检查哪些分区才能回答它。MySQL文档中有几个很好的例子:分区修剪。
它允许您将每个分区存储在不同的物理存储设备上,MySQL可以并行运行一些操作,或者根本不扫描某些分区(请参阅上面链接中的示例)。
如果分区不是单独访问的,为什么要命名它们?
它们是单独访问的,但你不需要做这个决定——优化器会做。分区名称让你更容易管理它们。您可以在文档中找到可能的操作(分区管理)。
由于MySQL 5.6.2,您可以从各个分区中选择数据,请参阅分区选择。只是一个建议-如果不必要的话,不要使用这种语法,因为使用它会使查询绑定到数据的存储结构(并且在生产中不要使用不稳定版本的MySQL;)。
数据的修剪实际上主要在插入数据时发挥作用。
例如,假设我在id
(一个整数列)上通过哈希对表进行了分区,我的哈希函数只是检查整数是否为奇数/偶数。因此,MySQL将有效地创建两个bin——odd bin
和even 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倍(现在我们不考虑哈希开销)。