如何在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字段建立索引吗?还是我的精选语句写得效率低下?

最佳答案

事实上在执行

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。

关于mysql - mysql udf json_extract在where子句中-如何提高性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26670022/

10-11 05:15
查看更多