有朋友问到,mysql如果要根据json中的某个属性过滤,数据量大的话,性能很差,要如何提高性能?
为什么要用json串?
由于一些特定场景,mysql需要用到json串,例如文档,不同的文档可能包含的属性不一样,且属性个数较多,这个时候用json存储比较合适,不然用宽表,影响性能,维护也麻烦(例如后期新增属性之类的)
好了,不废话,直接上方案
前置条件
创建表test,包含如下数据
常规的过滤
(全表扫描,效率低)
select id,name,extra from test where extra->'$.tid'='t3';
如何提升性能?
这里可以根据mysql5.7引入的虚拟列来解决
ALTER TABLE test ADD COLUMN v_tid varchar(32) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT( extra, _utf8mb4 '$.tid' ))) VIRTUAL NULL;
后面可以为这个虚拟列创建索引,根据虚拟列来过滤即可
select id,name,extra from test where v_tid='t3';
注意:如果要删除虚拟列,可以执行如下语句
ALTER TABLE test DROP COLUMN v_tid;