2014-10-31 434 views
1

如何在mysql数据库中高效地搜索json数据?mysql udf json_extract in where子句 - 如何提高性能

我从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倍以上(I选自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字段吗?或者,我的选择陈述书写效率低下?

回答

-2

我想如果你对你的查询做一个EXPLAIN,你会看到MySQL做了一个全表扫描,只是因为你的查询是一个没有索引的术语。

+0

这应该是一个评论 – Jakar 2015-11-23 18:08:58

1

事实上

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的外部代码。 Imho,在这种情况下最好的赌注是一个优化的UDF。

+0

谢谢你的澄清,但...这个问题差不多3岁! ;-)我最终将数据转储到弹性搜索实例中......问题解决了。 – edr 2017-06-30 06:56:11