假设我有一个名为的 MySQL JSON 数据类型custom_properties
对于媒体表:
存储在 json 数据中的示例custom_properties
列可以是:
{
"company_id": 1,
"uploaded_by": "Name",
"document_type": "Policy",
"policy_signed_date": "04/04/2018"
}
在我的 PHP Laravel 应用程序中,我会执行以下操作:
$media = Media::where('custom_properties->company_id', Auth::user()->company_id)->orderBy('created_at', 'DESC')->get();
这将获取属于公司 1 的所有媒体项目。
我的问题是我们有百万媒体记录,就性能而言,这是获取记录的糟糕方法吗?谁能解释一下 MySQL 如何索引 JSON 数据类型?
如果我们连接单独的表并对列建立索引,性能是否会显着提高?我想知道实际的性能差异是什么。
来自MySQL 官方文档 https://dev.mysql.com/doc/refman/5.7/en/json.html:
存储在 JSON 列中的 JSON 文档将转换为内部
允许快速读取文档元素的格式。当。。。的时候
服务器稍后必须读取以这种二进制格式存储的 JSON 值,
不需要从文本表示中解析值。二进制格式
其结构使服务器能够查找子对象或嵌套对象
直接通过键或数组索引获取值,无需读取所有值
在文档中它们之前或之后。
当他们说“快速读取访问”时,他们的意思是“比将 JSON 存储在TEXT
柱子。”
与索引查找相比,它的性能仍然很差。
使用 JSON_EXTRACT() 或->
运算符与在 MySQL 中搜索任何其他表达式相同,因为它会导致查询执行表扫描。
如果你想要更好的性能,你必须在你搜索的字段上创建索引。这需要定义一个生成的列 https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html在你可以建立索引之前。
See https://mysqlserverteam.com/indexing-json-documents-via-virtual-columns/ https://mysqlserverteam.com/indexing-json-documents-via-virtual-columns/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)