MySQL的UDF json_extract在where子句 - 如何提高性能(mysql udf

2019-10-21 05:20发布

我怎样才能有效地搜索JSON数据在MySQL数据库?

我安装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字段? 或者是我的select语句低效写的?

Answer 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条记录,因此速度损失来执行。 索引也不会有帮助,因为处理时间用完而TBY比MySQL的外部代码。 恕我直言,在这种情况下,最好的选择是一个优化的UDF。



Answer 2:

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

Flexviews物化视图的MySQL用于提取从使用JSON_EXTRACT到另一个表的JSON,其可被编入索引的数据。



Answer 3:

我认为,如果你做你的查询的解释,你会看到MySQL的执行全表扫描,仅仅是因为你的查询是在未编入索引的术语。



文章来源: mysql udf json_extract in where clause - how to improve performance