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

Jam*_*.Xu 11 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澄清分片分区,特别指出了数据的热门属性.

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

Joh*_*ica 31

我想你在这里混淆了一些条款.

您的所有数据都会进入一个数据库(也就是架构).在数据库中,您可以拥有表.

例如

table employee
   id integer
   name varchar
   address varchar
   country varchar

table office
   id integer
   employee_id integer
   address varchar
Run Code Online (Sandbox Code Playgroud)

在表格中,您有字段(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
Run Code Online (Sandbox Code Playgroud)

基础知识非常多.

为什么要进行分区
现在假设我们的数据库中有很多人(行).
记住这是一个银河数据库,所以我们有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.

  • 谢谢你,你帮助我更好地理解分片和分区,特别是让我把数据考虑在内是否很热.我读过这篇文章:http://blog.mayflower.de/archives/353-Is-MySQL-partitioning-useful-for-very-big-real-life-problems.html,它提到了一些限制mysql的分区.在我看来,举一个简单的例子,假设我们有一个用户表,更容易使用mysql-partition将表分成基于user_id的分区,而不是手动将表分成小表. - 因为mysql做了所有的事情 (2认同)
  • 我甚至不关心数据库,我发现这很有趣 (2认同)