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

标签 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.

每个客户 (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/

相关文章:

c# - ASP.NET (C#) 查询 MYSQL 无响应,永远等待 localhost

java - 如何获取多对多关系实体

MySQL - 使用波兰语字符进行不区分重音的搜索 - UTF8

PHP/mySQL---选择存在另一个值的最大值

php - 使用错误页面预防 SQL 注入(inject)

mysql - sql insert into, select, where 语句

sql - 聚类因子和唯一键

java - Oracle 自动增量功能 : Triggers or Oracle JDBC CallableStatement in 11. 2?

java - 优化mysql执行时间长约4分钟的查询

php - 服务器 'upgrade' 之后 MySQL/PHP 站点速度极慢 - PHP 版本问题?