为什么我们将mysql表分成许多小表?

时间:2011-05-31 13:07:49

标签: mysql performance

似乎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 属性的数据。

@Johan没有回答的小问题是:举一个简单的例子,假设我们有一个用户表,它有一个userid列(bigint)。我认为使用mysql-partition将表自动划分为基于userid的分区更容易,手动将表分成小表似乎没有好处(基于用户ID),我是对的吗?

2 个答案:

答案 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 | 123
  • A | 95467
  • B | 179

问题在于,当我们必须更新A的名称并且如果我们不更新所有内容时,它将导致混淆。所以我们可以把它分成两个这样的表。

  • 唯一ID |名称
  • 1 | A
  • 2 |乙

  • 唯一ID |编号

  • 1 | 123
  • 1 | 95467
  • 2 | 179

这将解决问题。可以使用“外键”以极好的方式处理约束,请阅读它以正确理解整个概念。

希望你明白:)