【发布时间】:2012-11-28 09:43:00
【问题描述】:
这个问题已经被问过了,但我没有找到“1 个语音答案”。
这样做更好吗:
- 一张大桌子:
user_id |属性_1 |属性_2 |属性_3 |属性_4
- 或 4 个小表,其中: 用户 ID |属性_1
user_id |属性_2
user_id |属性_3
user_id |属性_4
一张大桌子还是许多小桌子?每个用户只能有 1 个属性 X 值。我们有很多数据要保存(1 亿用户)。我们正在使用 innoDB。性能对我们来说非常重要(10 000 次查询/秒)。
谢谢!
弗朗索瓦
【问题讨论】:
-
这取决于您想对数据做什么,但从您的描述来看,两者都不是最佳的。相反,您可以拥有一个包含以下内容的表:user_id、attribute_num、attribute——因此,由于每个用户只有一个attribute_X 值,因此这仅涵盖了可以索引的3 个字段中的所有内容。对于某些特定任务,这可能不是最好的选择,但同样取决于您想要什么。
-
你需要问自己的问题是,你通常需要在同一个查询中为同一个用户获取多个属性吗?如果您有多个并且它们位于不同的表中,那么由于需要表连接,性能会变慢。
-
@sn00k4h 我们通常只进行原子选择/更新(出于缓存原因,当时只有一个属性)。因此,为了询问 10 个属性,我们进行了 10 个调用(但可能只有 1 个或 0 个请求,具体取决于缓存状态)。
-
@Ynhockey 我们不能使用 "user_id, attribute_num, attribute" 因为属性字段可以是 int、bigint、date、float 等...
-
尝试以您提到的方式优化缓存命中可能会或可能不会真正提高您的性能,具体取决于各种因素。如果我是你,我会尝试不同的可能设计并比较性能,因为这是你(更)确定的唯一方法。不同数据集的相同设计可以执行非常不同的操作。您可以尝试的另一种可能的设计是两种方式的混合 - 将具有相对较小数据类型(例如:int、date)的“属性”放在同一个表中,并将较大的数据类型分开。
标签: mysql performance optimization innodb