Mysql有效地在行或列中存储动态客户数据

时间:2014-09-18 17:38:21

标签: mysql sql database-performance

' CUSTOMER_DATA'表:

id - int auto increment
user_id - int
json - TEXT field containing json object
tags - varchar 200

* id + user_id are set as index.

每个客户(user_id)可能有多行。 " JSON"是文本,因为它可能非常大,有很多键,或者没有那么大,只有很少的键包含短值。 我经常为user_id搜索json。

问题:超过100,000行,完成查询需要花费很长时间。我知道TEXT字段非常浪费,而且mysql不能很好地索引它们。

修复1: 转换" json"字段到同一个表中的多个列,其中某些列可能为空。 修复2: 使用user_id | key |值创建另一个表,但我可能会进入巨大的"加入"这会不会慢得多?键也是字符串,但值可以是int或text和各种长度。如何调和呢?

我知道这是一个非常常见的用例,"行业标准是什么"对于这个用例?

更新

所以我猜Fix 2是最好的选择,我如何查询这个表并有效地获得一行结果?

id | key   | value
-------------------
1  | key_1 | A
2  | key_1 | D
1  | key_2 | B
1  | key_3 | C
2  | key_3 | E

结果:

id | key_1 | key_2 | key_3
---------------------------
 1 |  A    |   B   |  C
 2 |  D    |       |  E

1 个答案:

答案 0 :(得分:1)

这个答案有点在你问题中定义的方框之外,但我建议:

修复3:使用MongoDB而不是MySQL。

这根本不是批评MySQL - MySQL是一个很好的结构化关系数据库实现。但是,您似乎对使用结构化方面或关系方面感兴趣(或者由于特定的用例和要求,或者由于您自己的编程偏好,我不确定哪个)。使用MySQL是因为关系架构适合您的用例(如果有)会有意义;使用关系架构作为一种解决方法,使MySQL对您的用例有效(似乎是您正在考虑的路径)似乎是不明智的。

MongoDB是另一个很棒的数据库实现,它结构较少而不是关系型,专为您描述的用例而设计:灵活地存储大量带有各种标识符的json数据,并有效地存储/检索它们,不得不担心不同记录之间的结构一致性。 JSON是Mongo的原生文档表示。