' 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
答案 0 :(得分:1)
这个答案有点在你问题中定义的方框之外,但我建议:
修复3:使用MongoDB而不是MySQL。
这根本不是批评MySQL - MySQL是一个很好的结构化关系数据库实现。但是,您似乎对使用结构化方面或关系方面感兴趣(或者由于特定的用例和要求,或者由于您自己的编程偏好,我不确定哪个)。使用MySQL是因为关系架构适合您的用例(如果有)会有意义;使用关系架构作为一种解决方法,使MySQL对您的用例有效(似乎是您正在考虑的路径)似乎是不明智的。
MongoDB是另一个很棒的数据库实现,它结构较少而不是关系型,专为您描述的用例而设计:灵活地存储大量带有各种标识符的json数据,并有效地存储/检索它们,不得不担心不同记录之间的结构一致性。 JSON是Mongo的原生文档表示。