似乎divide the data of one table into many databases, many tables
通常的做法是提高性能,我可以理解many databases
部分,因为更多的数据库提供更多的CPUS,更多的内存,更多的IO容量。但很多桌子?为什么不直接使用mysql分区http://dev.mysql.com/doc/refman/5.1/en/partitioning.html?
更新:我不是指正常化。我的意思是将 N 记录表分成例如 10 每个小表的表都有 N / 10 记录
update2 :感谢@Johan澄清分片和分区,特别指出 hot 属性的数据。
答案 0 :(得分:32)
我认为你在这里混淆了一些条款。
您的所有数据都会进入一个数据库(即架构)。 在数据库中,您可以拥有表格。
e.g。
table employee
id integer
name varchar
address varchar
country varchar
table office
id integer
employee_id integer
address varchar
在内部表格中,您有字段(id, name, address)
即列。
表格有一行或多行
表雇员的一个例子:
id name address country
----------------------------------------------------
1 John 1 Regent Street UK
2 James 24 Jump Street China
3 Darth Vader 1 Death Star Bestine, Tatooine
基础知识非常多。
为什么要进行分区
现在假设我们的数据库中有很多人(行)
记住这是一个银河系数据库,所以我们有1000亿条记录
如果我们想要快速搜索,那么如果我们能够并行执行此操作就很好
所以我们对表进行分区(比如按国家/地区),然后我们可以让x服务器分别查看1个国家/地区
跨服务器的分区称为sharding
。
或者我们可以分区,例如按年份划分的历史数据,因此我们无需通过所有数据来获取最近新闻。我们今年只需要通过分区。这称为partitioning
。
sharding
只能partitioning
之间的最大区别是什么?
<强>拆分强>
在sharding
中,您预计全部您的数据是相关的,同样可能会被查询。 (例如谷歌可以期望查询他们的所有数据;归档他们的部分数据对他们来说是无用的)
在这种情况下,您需要许多机器并行查看您的数据,其中每台机器都完成部分工作
因此,您为每台计算机提供不同的数据分区(分片),并为所有计算机提供相同的查询。当结果出来时,你UNION
将它们全部放在一起并输出结果。
基本分区
在基本partitioning
部分,您的数据为hot
,部分为not
。典型案例是历史数据,新数据为hot
,旧数据难以触及
对于这个用例,将旧数据放在单独的服务器中是没有意义的。这些机器只会等待,等待,什么也不做,因为除了一些每年查看一次的审核员外,没有人会关心旧数据。
因此,您按年度对数据进行分区,服务器将自动归档旧分区,以便您的查询只查看一年(可能是2年)数据并且速度更快。
我需要分区吗?
您只有在拥有大量数据时才进行分区,因为它会使您的设置变得复杂
除非你有超过一百万条记录,否则你不必考虑分区。 *)
如果你有超过1亿条记录,你一定要考虑它。 *)
有关详细信息,请参阅:http://dev.mysql.com/doc/refman/5.1/en/partitioning.html
并且:http://blog.mayflower.de/archives/353-Is-MySQL-partitioning-useful-for-very-big-real-life-problems.html
另请参阅wiki:http://en.wikipedia.org/wiki/Partition_%28database%29
*)这些只是我个人的启发式YMMV。
答案 1 :(得分:-1)
将数据拆分为较小的表以“标准化”。这是一个非常有趣的概念。你可以在这里阅读更多内容。
http://en.wikipedia.org/wiki/User:Jaseemabid/Books/Database_normalisation
一个简单的例子。
假设一个小型电话簿应用程序,允许人们拥有多个号码。
一种设计方式就是这样
问题在于,当我们必须更新A的名称并且如果我们不更新所有内容时,它将导致混淆。所以我们可以把它分成两个这样的表。
2 |乙
唯一ID |编号
这将解决问题。可以使用“外键”以极好的方式处理约束,请阅读它以正确理解整个概念。
希望你明白:)