1

如何有效地搜索 mysql 数据库中的 json 数据?

我从 labs.mysql.com 安装了 extract_json udf,并使用了一个包含 2.750.000 个条目的测试表。

CREATE TABLE `testdb`.`JSON_TEST_TABLE` (
   `AUTO_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
   `OP_ID` INT NULL,
   `JSON` LONGTEXT NULL,
PRIMARY KEY (`AUTO_ID`)) $$

示例 JSON 字段如下所示:

{"ts": "2014-10-30 15:08:56 (9400.223725848107) ", "operation": "1846922"}

我发现将 json_extract 放入 select 语句中几乎没有性能影响。即以下选择(几乎)具有相同的性能:

SELECT * FROM JSON_TEST_TABLE where OP_ID=2000000 LIMIT 10;

SELECT OP_ID, json_extract(JSON, "ts") ts, json_extract(JSON, "operation") operation FROM JSON_TEST_TABLE where OP_ID=2000000 LIMIT 10; 

但是,只要我将 json_extract 表达式放入 where 子句,执行时间就会增加 10 倍或更多(我从 2.5 秒增加到 30 秒):

SELECT OP_ID, json_extract(JSON, "ts") ts, json_extract(JSON, "operation") operation FROM JSON_TEST_TABLE where json_extract(JSON, "operation")=2000000 LIMIT 10;

此时我在想,我需要在插入时将要搜索的所有信息提取到单独的列中,并且如果我真的必须在 json 数据中搜索,我需要首先缩小要搜索的行数按其他标准,但我想确保我没有遗漏任何明显的东西。例如,我可以以某种方式索引 json 字段吗?还是我的选择语句写得效率低?

4

2 回答 2

2

实际上在执行过程中

SELECT * FROM JSON_TEST_TABLE where OP_ID=2000000 LIMIT 10;

json_extract() 最多执行 10 次。

在此期间

SELECT OP_ID, json_extract(JSON, "ts") ts, json_extract(JSON, "operation") operation FROM JSON_TEST_TABLE where json_extract(JSON, "operation")=2000000 LIMIT 10;

json_extract() 将为每一行执行,结果限制为 10 条记录,因此速度损失。索引也无济于事,因为处理时间用完了,而不是外部代码而不是 MySQL 的。恕我直言,在这种情况下最好的选择是优化的 UDF。

于 2017-06-28T19:31:23.467 回答
1

你可以试试这个: http ://www.percona.com/blog/2015/02/17/indexing-json-documents-for-efficient-mysql-queries-over-json-data/

MySQL 的 Flexviews 物化视图用于使用 JSON_EXTRACT 从 JSON 中提取数据到另一个可以索引的表中。

于 2015-03-02T09:05:00.617 回答