【发布时间】:2020-04-19 15:12:11
【问题描述】:
我正在使用 MySQL 8 的新 JSON 功能,尤其是多值索引。
我注意到有两种方法可以检查 JSON 数组是否包含给定值:MEMBER OF() 运算符和JSON_CONTAINS() 函数。
对于我进行的每个查询,它们都返回相同的结果集,但令人惊讶的是,MEMBER OF 似乎比 JSON_CONTAINS 快 3 倍。
以具有 200,000 条记录的表为例,catIds 字段中总共有大约 700,000 个值:
CREATE TABLE test (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
catIds JSON NOT NULL,
PRIMARY KEY (id),
KEY test_categories ((CAST(catIds AS UNSIGNED ARRAY)))
);
INSERT INTO test (catIds) VALUES('[123, 456]');
...
...稍后插入了大约 200,000 条记录:
mysql> SELECT count(*) FROM test WHERE 51 member of (catIds);
+----------+
| count(*) |
+----------+
| 7287 |
+----------+
1 row in set (0.11 sec)
mysql> SELECT count(*) FROM test WHERE JSON_CONTAINS(catIds, '51');
+----------+
| count(*) |
+----------+
| 7287 |
+----------+
1 row in set (0.36 sec)
如果最初认为这是因为字符串化的 JSON 值 '51' 可能在每次迭代时都被转换,所以我尝试先将其分配给变量;但这并没有让它变得更快:
mysql> SET @value = CAST(51 as JSON);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT count(*) FROM test WHERE JSON_CONTAINS(catIds, @value);
+----------+
| count(*) |
+----------+
| 7287 |
+----------+
1 row in set (0.38 sec)
除非我弄错了,MEMBER OF() 和 JSON_CONTAINS() 在功能方面是等效的。在这种情况下,为什么其中一个比另一个快?
【问题讨论】:
-
“除非我记错了,否则 MEMBER OF() 和 JSON_CONTAINS() 在功能方面是等效的。” 您是否比较了他们的文档页面来确认这一点?
-
@LightnessRacesBY-SA3.0 我确实说得有点快。