MySQL分区这是一个很常见的问题,看看我们能做什么。

那么,什么是MySQL分区?

分区是一个数据库(MySQL在这种情况下)将其实际数据分解成单独的表,但仍被SQL层视为一个表。

在MySQL分区时,最好找一个自然的分区键。你想确保表查找到正确的分区或一组分区。这意味着所有选择、更新、删除应包括这一列在WHERE子句中。否则,存储引擎散集,和查询所有分区的联盟不是并发。

一般来说,您必须添加分区键进入主键以及汽车增量,即。主键(part_id id)。如果你没有设计良好的和小列复合主键,它可以扩大你的所有二级索引。

你可以通过范围或散列分区。范围是伟大的,因为你在每个表组的id,它有助于跨分区id查询时。这仍然可以创建新分区中的热点,为所有新插入去那里。分区通过哈希表“负载平衡”,并允许您编写并发多分区。这使得范围查询的分区键一个坏主意。

在MySQL 5.7中,分区成为本地存储引擎和弃用旧方法在MySQL本身处理分区。这意味着InnoDB分区(和一个更大的分区)是一个比过去更好的选择。

与所有功能和建议,这只有当它有助于您的数据和工作负载!

9评论
最古老的
最新的 大多数投票
内联反馈
查看所有评论
玛雅Tyagi

嗨Manjot,我想主键(part_id id), id是自动增加的列,不会工作。因为汽车增量列应该在第一个位置在创建复合主键。

玛雅,解决方法很简单:也有指数(id)。唯一AUTO_INCREMENT需要首先是id在某些指数。它不需要PK或独一无二的。(然而,没有唯一性约束可以插入一个重复的id,但谁会这样做!)

我已经使用这种技术几次。它提供了“集群”part_id的性能优势,同时还拥有一个独特的主键。也就是说,它有利于一个选择…part_id = 123与123多个行。和…之间对于part_id选择…。

注意,分区添加这些选择都没有好处。

然而,你会吃惊,有几个用例得到任何与分区和一个更好的性能优势指数在一个非分区表。

Manjot辛格

这完全取决于你的工作负载。我建议分区在很多情况下。有许多人用2 b行表和访问去年只有5%的99%的时间。

你能提供一个5使用情况分区可以提高性能?看到http://mysql.rjweb.org/doc.php/partitionmaint我所知道的4例。

(我不能想象你的例子哈希“负载均衡”提供任何性能优势。你有“证据”吗?)

安倍

如果我´正确,分区表意味着将被分割成许多文件,给刚读的优势与规模小而不是一个文件读入一个文件,当然应该设计的查询。

Manjot辛格

完全正确!

里克•詹姆斯

索引也为减少你需要阅读多少。

内存

谢谢你们的有趣的讨论。

我们正在做一个项目,如果成功可能十亿在单个表的行。目前,我们正在建立一个MVP和要做的证明价值。

我们有点担心潜在的行数单个表。我们正在寻找指导分区和索引和/或两者兼而有之。我们将有一个变量(比如客户ID在产品表),可以用来创建几乎为每个客户不同的表中。

你会建议我们直接创建一个引用表(创建)一个产品表给客户吗?或者我们只做分区。