'客户数据'表:
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”是文本,因为它可能非常大,有很多键,或者不太大,只有很少的键包含短值。 我通常在 json 中搜索 user_id。
问题:超过 100,000 行并且需要很长时间才能完成查询。我知道 TEXT 字段非常浪费,而且 mysql 没有很好地索引它们。
修复 1: 将“json”字段转换为同一个表中的多个列,其中某些列可能为空。 修复 2: 使用 user_id|key|value 创建另一个表,但我可能会进入巨大的“连接”,这不会慢很多吗?键也是字符串,但值可以是 int 或文本以及各种长度。我该如何调和?
我知道这是一个非常常规的用例,这个用例的“行业标准”是什么?
更新
所以我想 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
最佳答案
这个答案有点超出您问题中定义的范围,但我建议:
修复 3:使用 MongoDB 而不是 MySQL。
这根本不是在批评 MySQL——MySQL 是一个出色的结构化关系数据库实现。但是,您似乎对使用结构化方面或关系方面都不感兴趣(可能是因为特定的用例和要求,也可能是因为您自己的编程偏好,我不确定是哪一种)。因为关系架构适合您的用例(如果适合)而使用 MySQL 是有意义的;使用关系架构作为使 MySQL 对您的用例有效的解决方法(这似乎是您正在考虑的路径)似乎是不明智的。
MongoDB 是另一个出色的数据库实现,它结构化程度较低且非关系型,专为您描述的那种用例而设计:灵活地存储具有各种标识符的大 json 数据 block ,并高效地存储/检索它们,而无需不必担心不同记录之间的结构一致性。 JSON 是 Mongo 的原生文档表示。
关于Mysql高效地以行或列存储动态客户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25919054/