【续】在where过滤条件中加入json字段的判断,查询效率下降的问题

为了更快的定位您的问题,请提供以下信息,谢谢
【详述】继续上一个帖子(在where过滤条件中加入了json字段的判断,查询效率会下降很多),在设置set enable_column_expr_predicate=false后,json字段的过滤查询依然会出现很慢的情况,下面做了一些测试

比较快的查询如下:
不带json属性过滤
MySQL [test_db]> select count(0) as result from ods_event
-> where (event_generate_time>=‘2023-10-30 00:00:00’ and event_generate_time<=‘2023-11-01 13:59:59’) and array_contains(event_tags,‘打印’);
±-------+
| result |
±-------+
| 2562 |
±-------+
1 row in set (0.05 sec)

这个查询也有json属性过滤,但时间范围筛选的数据只有17万行
MySQL [test_db]> select count(0) as result from ods_event
-> where (event_generate_time>=‘2023-10-30 00:00:00’ and event_generate_time<=‘2023-11-01 13:59:59’) and array_contains(event_tags,‘打印’)
-> and data->‘eventResponsiblePerson.userName’=‘国汝超’;
±-------+
| result |
±-------+
| 7 |
±-------+
1 row in set (0.17 sec)

不带json属性过滤,时间范围筛选后的数据有1亿行
MySQL [test_db]> select count(0) as result from ods_event
-> where (event_generate_time>=‘2023-10-20 00:00:00’ and event_generate_time<=‘2023-11-01 13:59:59’) and array_contains(event_tags,‘打印’);
±-------+
| result |
±-------+
| 7522 |
±-------+
1 row in set (0.36 sec)

比较慢的查询如下:
相比上一条查询,多了json属性的过滤
MySQL [test_db]> select count(0) as result from ods_event
-> where (event_generate_time>=‘2023-10-20 00:00:00’ and event_generate_time<=‘2023-11-01 13:59:59’) and array_contains(event_tags,‘打印’)
-> and data->‘eventResponsiblePerson.userName’=‘国汝超’
-> ;
±-------+
| result |
±-------+
| 28 |
±-------+
1 row in set (32.66 sec)

event_generate_time是排序键,快查询通过event_generate_time筛选后的行数是17万条,加上array_contains(event_tags,‘打印’)过滤后的行数是2562条,慢查询通过event_generate_time筛选后的行数是1亿条,加上array_contains(event_tags,‘打印’)过滤后的行数是7522条,但加上data->'eventResponsiblePerson.userNam’后查询慢了几十倍

【附件】
查询计划
json-sql.txt (18.3 KB)

快查询的profile
json快sql-profile.txt (43.2 KB)

慢查询的profile
json慢sql-profile.txt (41.8 KB)

去掉json字段的profile
sql-profile.txt (42.1 KB)

分区信息

磁盘使用情况

set enable_column_expr_predicate=true;
然后执行
select count(*) from (
select * from ods_event
where (event_generate_time>=‘2023-10-20 00:00:00’ and event_generate_time<=‘2023-11-01 13:59:59’) and array_contains(event_tags,‘打印’) limit 10000000
) tb where tb.data->‘eventResponsiblePerson.userName’=‘国汝超’;

执行的时候会报一个错