1个非常大的桌子或3个大桌子? MySQL性能

时间:2014-01-07 15:57:24

标签: mysql sql

假设一个非常大的数据库。一张包含9亿条记录的表格。

方法A:
表:帖子

+----------+-------------- +------------------+----------------+
| id (int) | item_id (int) | post_type (ENUM) | Content (TEXT) |
+----------+---------------+------------------+----------------+
|    1     |      1        |       user       |  some text ... |
+----------+---------------+------------------+----------------+
|    2     |      1        |       page       |  some text ... |
+----------+---------------+------------------+----------------+
|    3     |      1        |       group      |  some text ... |

// row 1 : User with ID 1 has a post with ID #1
// row 2 : Page with ID 1 has a post with ID #2
// row 3 : Group with ID 1 has a post with ID #3

目标是在页面中显示来自所有3 post_types的20条记录。

SELECT * FROM posts LIMIT 20

但我担心此方法的记录数

方法B:
将9亿条记录分成3个表,每个表3亿个。

表:用户帖子

+----------+-------------- +----------------+
| id (int) | user_id (int) | Content (TEXT) |
+----------+---------------+----------------+
|    1     |      1        |  some text ... |
+----------+---------------+----------------+
|    2     |      2        |  some text ... |
+----------+---------------+----------------+
|    3     |      3        |  some text ... |

表:页面帖子

+----------+-------------- +----------------+
| id (int) | page_id (int) | Content (TEXT) |
+----------+---------------+----------------+
|    1     |      1        |  some text ... |
+----------+---------------+----------------+
|    2     |      2        |  some text ... |
+----------+---------------+----------------+
|    3     |      3        |  some text ... |

表:小组帖子

+----------+----------------+----------------+
| id (int) | group_id (int) | Content (TEXT) |
+----------+----------------+----------------+
|    1     |      1         |  some text ... |
+----------+----------------+----------------+
|    2     |      2         |  some text ... |
+----------+----------------+----------------+
|    3     |      3         |  some text ... |

现在获取要显示的20个帖子的列表

SELECT * FROM User_Posts LIMIT 10
SELECT * FROM Page_Posts LIMIT 10
SELECT * FROM group_posts LIMIT 10

//创建一个数组或结果对象。并显示在输出中。

在这个方法中,我应该在php中的数组中对它们进行排序,然后将它们semd到页面。

首选哪种方法?
将9亿个记录表分成3个表会影响mysql的读写速度吗?

1 个答案:

答案 0 :(得分:2)

这实际上是关于Singe - Table - 继承与表每类继承以及缺少连接继承的讨论。前者与方法A相关,第二个与方法B相关,方法C将在一个表中包含您帖子的所有ID,并推迟组或用户的特定属性 - 将帖子发布到不同的表中。 虽然拥有一个大尺寸的表总是有与表全扫描相关的负面影响,但分割表的方法也有它自己的。这取决于您的应用程序访问整个帖子列表所需的频率,而不仅仅是检索某些帖子类型。 您应该考虑的另一个考虑因素是数据分区,可以使用MySQL或Oracle数据库完成,例如这是一种在表中组织数据的方法,给定了信息生命周期的机会(可以在何时以及多长时间访问数据,可以移动和压缩部分数据,从而减少数据库大小并提高访问数据左侧部分的速度)表),基本上分为三大技术: 基于范围的分区,基于列表的分区和基于散列的分区。 与缩小表格大小相关的其他不太常用的功能是处理插入的插入,其中时间戳在某个时间段到期后自动使插入的数据无效。 确实是主要的应用程序设计决策并且可以提高性能是在应用程序级别区分对数据库的读取和写入访问。 考虑一个MySQL - 后端:因为写入访问显然对数据库性能更关键,然后读访问你可以设置一个MySQL - 写入数据库的实例和另一个作为读取的复制者,尽管这也是可以讨论的,主要是当它来到RDT(实时决策),在任何给定时间数据的绝对一致性是必须的。 使用对象池作为应用程序和数据库之间的层也是一种提高应用程序性能的技术,尽管我还不知道PHP世界中现有的解决方案。 Oracle Hot Cache是​​一个相当复杂的例子。 您可以构建自己的实现在内存数据库之上或使用内存缓存。