首页 > 解决方案 > 把所有东西都放在一张桌子上是不好的做法吗?

问题描述

寻找一些反馈 - 我正在构建一个社交网络类型的软件 - 其中一个功能允许用户发布新闻故事并让朋友发表评论。我过去为新闻、评论、日历事件等保留了不同的表。但是,一位朋友将我转向了“POSTS”和“post_types”的wordpress类型数据库结构,其中所有内容都在一个表中并且有一个“post_type”。

这意味着新闻故事、评论、事件等都在同一个表中。我喜欢创建更新一张表的函数的效率。但是,我的旧软件中的单个表是 150 万行,我希望这个新表在第一年增长到大约 1000 万行。

只要正确设置索引,mysql是否可以处理这种大小的数据,或者出于这个原因将所有内容分成单独的表是否更聪明?

标签: mysqliindexing

解决方案


没有普遍的答案。这取决于。

MySQL 处理大表没有问题。然而,它不会为你创造奇迹。最后,一切都与效率有关。这意味着您需要针对多个相互排斥的目标优化您的设计。您想要找到的是复杂性、性能、可扩展性和维护成本之间的最佳平衡点。这对于每个项目都是不同的,是一种艺术。

一般不想混合太不同的东西。这就是为什么他们几乎在每本数据库书籍或 CS 课程中都教授数据规范化的原因。如果您的数据很小,这并不重要。但是,如果您有大量数据和大量请求,您几乎肯定会想从数据库中榨取最后一滴性能。因此,您不仅要分离表、检查索引、检查执行计划、更新统计信息、整理页面和测量性能,还要使用分区、集群、物化视图、只读副本、I/O 和 CPU 并行性, SSD、Memcached 和各种其他工具。如果您从一个糟糕的数据模型开始,这将更具挑战性。以我个人的经验,

要进行任何类型的估计,您需要有一些性能基线。仅仅知道记录的数量是不够的。会有多少请求?查询将做什么?您预计最重的负载在哪里?您能否准备系统将在大部分时间运行的最常见查询?高峰时段呢?哪些硬件可用于运行此负载?读取与写入的比率是多少?等等。

要进行优化,您需要某种目标。和往常一样,你会发现为了到达那里,你必须牺牲一些东西。因为您可能还没有所有这些答案,请尝试遵循极简主义原则——从小处着手、衡量、分析、改进、重复。


推荐阅读