【发布时间】:2014-12-27 11:58:40
【问题描述】:
如何在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 语句中几乎没有性能影响。 IE。以下选择(几乎)具有相同的性能:
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 语句写的效率低?
【问题讨论】:
-
我认为如果您对查询执行 EXPLAIN,您会看到 MySQL 进行了全表扫描,这仅仅是因为您的查询是在未编入索引的术语上。
标签: mysql json where-clause database-performance mysql-udf