【问题标题】:Storing large JSON - binary or text存储大型 JSON - 二进制或文本
【发布时间】:2017-05-03 02:25:29
【问题描述】:

我阅读了很多帖子,发现了很多不同的回复。

运行 MYSQL 5.7,我有一个大型 JSON 对象,不需要查询,只需存储。使用JSON 似乎效率低下——我不需要验证它。在这种情况下,最好的解决方案是什么? BLOB 或 TEXT 是显而易见的选择,但两者中最好的选择是什么?

需要将二进制文件转换回文本(最好如何做到这一点?PHP 还是在 SQL 查询期间?)只需要返回文本。我真的很感激任何澄清......

【问题讨论】:

  • 终于有人问了一个问题,在哪里使用mysql JSON字段是合理的!但他不想使用它:-)
  • 刚读完我读过的东西。就像我说的,我发现了很多不同的反应。但谢谢你,我将继续使用 JSON,同时用额外的鞭子喝我的肉桂冰茶拿铁。
  • @N.B.我不同意,如果您不需要/直接在数据库中查询 json 的内容,则不需要使用 JSON。使用 db 将非统一 JSON 结构存储为文本并仅在实际需要的客户端使用 JSON 对象是一种有效的技术。
  • @e4c5 您有权不同意。从概念上讲,添加您不打算使用的功能是错误的。您不会将 html 解析器添加到 mp3 播放器,因为它不会影响性能。而且无论节省多小,都容易做到,所以应该是默认的。
  • @e4c5 我投入了两分钱,不想和你发生争执。他征求意见,这是我的。我不需要做基准测试,因为正如所说,无论差异多么小,都会有差异。由于我也是社区的一员,我也有权发表我的意见,我正在给予它。就是这样。

标签: php mysql json


【解决方案1】:

manual 对 JSON 类型有何看法?

优化的存储格式。存储在 JSON 列中的 JSON 文档是 转换为允许快速读取访问的内部格式 文档元素。当服务器稍后必须读取存储的 JSON 值时 在这种 binary 格式中,不需要从文本中解析值 表示。二进制格式的结构是为了启用服务器 通过键或数组索引直接查找子对象或嵌套值 无需读取文档中它们之前或之后的所有值。

强调我的。您显然正在保存这个 JSON 对象,因为您打算在其他时间读取它。如果您在每个查询中读取它,将其存储为 BLOB 或 TEXT 可能是您从数据库中检索它的部分速度快了几微秒,但您将花费更多时间将 TEXT 对象转换为 JSON 文档。

另外,我们不要忘记 JSON 字段会去除所有不需要的空格等,因此它会比 TEXT 和 BLOB 更紧凑,这可能会抵消这两种类型所带来的任何检索速度提升。

此外,使用 JSON 可以让您的系统经得起未来考验。有一天,您可能需要在 JSON 字段中搜索特定项目,但您在 BLOB 字段中有 350 万条记录,然后呢?

【讨论】:

  • json_encode() 和 JSON.stringify() 等函数不会在 JSON 字符串中放置任何不必要的空格(除非您要求他们预先打印它),因此 MySQL 无需删除任何内容。无论如何,您必须在将字符串发送到 MySQL 之前进行转换——JSON 类型不允许您在查询中放置实际的数组或对象。
  • 我同意的部分答案是面向未来的。但是,如果您确定永远不需要搜索,那么每次执行查询时将所有从文本转换为内部 JSON 表示的开销真的值得吗?
  • 关于第一条评论,如果它是在 OP 代码中生成的数组或字典,我可以同意这一点。但是,在这种情况下,它很可能是可重复使用或可重复使用的东西(无论如何,OP 都没有解释这种情况)。如果它是来自外部源的 JSON,它通常首先以字符串形式提供,因此无需将其 json_encode 回来。
  • @Barmar 我最近为 django JSONFields 做了一个基准测试,解码/编码过程一点也不贵。
猜你喜欢
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多