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

Mysql高效地在行或列中存储动态客户数据,mysql,sql,database-performance,Mysql,Sql,Database Performance,“客户数据”表: id - int auto increment user_id - int json - TEXT field containing json object tags - varchar 200 * id + user_id are set as index. 每个客户(用户id)可能有多行。 “json”是文本,因为它可能非常大,有许多键,或者不太大,只有几个键包含短值。 我通常搜索json以获取用户的id 问题:超过100000行,完成一个查询需要花费很长时间。我知道文

“客户数据”表:

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

* id + user_id are set as index.
每个客户(用户id)可能有多行。 “json”是文本,因为它可能非常大,有许多键,或者不太大,只有几个键包含短值。 我通常搜索json以获取用户的id

问题:超过100000行,完成一个查询需要花费很长时间。我知道文本字段非常浪费,mysql没有很好地索引它们

修正1: 将“json”字段转换为同一表中的多列,其中某些列可能为空。 修正2: 创建另一个具有user|id | key |值的表,但我可能会进入巨大的“连接”,这不会慢很多吗?键也是字符串,但值可以是int或text,长度也可以不同。我如何协调这一点

我知道这是一个非常常见的用例,这个用例的“行业标准”是什么

更新

所以我想Fix2是最好的选择,我如何高效地查询这个表并得到一行结果呢

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数据的大数据块,并高效地存储/检索它们,而不必担心不同记录之间的结构一致性。JSON是Mongo的原生文档表示。

我认为第二种方式是最好的方式。即使字段值是文本,您的查询也会比现在快。如果读多于写,请在新表的字段键中添加一个索引。@Enrique只是为了清楚json是文本,因为它是从CSV文件加载的,它是一个庞大的20多个字段,从电子邮件到描述,再到各种内容的计数。你认为每个都应该是文本吗?还是非常大的瓦查尔(比如500)?我以为文字是我的杀手锏,我应该避免吗?谢谢您的帮助。我建议使用文本,因为您说过:“键也是字符串,但值可以是int或text,长度也可以不同”。当然,如果“各种长度”低于500塔恩,最好使用varchar(500)颜色(我很感兴趣:-)但是在这一点上,谈论将一个大型运营迁移到一个全新的DB可能会让我的CEO心脏病发作。。。关系数据库Postgres9.4也非常支持json索引,即二进制json/json数据格式。但将数据迁移到另一个数据库应该是最后的选择