为什么分区?

分区是一个一般的方法实现性能在MySQL和其他数据库。(见在这里,在这里,在这里和其他许多的例子。)我开始想知道分区的性能从哪里来,我总结了我的一些想法。

但首先,分区是什么?(我已经从朱塞佩•Maxia的例子分区在实践中介绍)。

在这个简单的示例中,得到四个分区,根据组件的日期字段。这是一个简单的例子,所以很容易看到发生了什么,而不去纠缠在增加了复杂性。但增加了复杂性与分区是一个不争的事实——当你想要一个每周分区在过去的两年,需要管理104个分区?讨厌的东西!,所以需要有一个令人信服的理由去分区。这给我们带来的问题:分区有哪些好处?

批量删除

如果你分区表,那么可以删除一个分区,从而很快删除分配一个数据块。例如

B-tree-based存储引擎,比如InnoDB,缓慢的删除数据,表和删除片段,后果的性能。删除一个分区删除快和不片段表。另一方面,为分形树的存储引擎,像TokuDB,删除正在快速——尽管不是一个分区,以最快的速度下降分形树索引不片段

所以分区下降给一个明显的好处,如果你要使用InnoDB。在分形树索引的情况下,即时分区下降还不错,但分区不是那么强,因为它是不清楚复杂性是值得的。

没有免费午餐或“分而治之”的谬论

离开除了删除,我看到提到使用分区最常见的原因是声称分区优惠大表成更小的表。小表是更快,对吧?嗯,没有。小表的集合,你需要交换,未必比一个表,你必须交换的部分。与流行的看法相反,分区不是“分而治之”的一个例子。(分而治之,你分手一个问题然后解决每一块都是相互独立的。虚拟内存意味着“解决方案”来管理各个分区的索引块并不是独立的。)

我这样想:你只是交换到另一个数据结构在桌子上。在一个案例中,你有一个表由b - Tree,分形树索引,等等,虚拟内存移动部件的结构在内存中。在其他情况下,您有一个混合数据结构,底部有树木,无论MySQL使用管理分区。和虚拟内存还是移动的部分混合结构的内存。

更具体地说:假设你一个表分割成块,每一个都适合在内存中。这应该是好的,对吗?让我们考虑两种极端情况下。首先,假设你的插入/查询用例锤子在一个分区上。你交换分区,你跑得快,因为一切都在内存中。但是如果你没有分区,你仍然在活跃的一部分交换表到内存中去快。

在另一个极端,假设你从分区到分区。然后你必须保持交换在不同的分区。没有分区,你保持交换的索引树。

简而言之,天下没有免费的午餐。分区只是替换为另一个数据结构表,没有理由相信,新的数据结构很好。

分区的主要优势是什么?

这是下一篇文章将是什么。请继续关注。

1评论
最古老的
最新的 大多数投票
内联反馈
查看所有评论
贾斯汀Swanhart

如果你有一个表和一个长尾,这是很少很少访问从老数据删除,然后在热分区的索引分区较小的结果在更好的性能。这是很常见的,我通常建议分区的情况。

您还可以使用innodb_file_per_table w /符号链接(与facebook只安全补丁)将分区放在不同的IO子系统。如果你(见并行执行查询http://code.google.com/p/shard-query使用分区),那么你可以得到更好的性能比不使用它们。这是一个“分而治之”的例子。