MySQL中JSON列转TEXT建联合索引能否提升全匹配查询性能?
从纯查询性能角度,优先选择将filters转为TEXT类型并创建包含idCompanyRadar、idUser、filters、reference的联合索引,原因如下:
索引直接带来量级的性能提升:
当数据量达到一定规模后,无索引的全表扫描性能会急剧下降——MySQL需要遍历表中每一行,逐个比对filters的JSON值。而联合索引可以让数据库直接通过索引树定位到匹配的行,过滤效率会有本质区别,尤其是查询频率较高的场景,这个差距会非常明显。JSON类型在此场景下无优势,反而有局限:
你只需要对filters做完全匹配,JSON类型的路径查询、结构解析等特性完全用不上。而且MySQL无法直接将原生JSON字段加入联合索引(虽然可以用生成列间接实现,但生成列本质是额外存储了一份标准化的字符串,反而多了维护开销)。没有索引的JSON字段查询,性能和无索引的TEXT字段没有区别,甚至因为JSON类型的解析开销,可能更慢。TEXT类型完全适配你的需求:
只要保证存储的JSON字符串和查询时传入的JSON格式完全一致(比如键的顺序、空格、引号格式统一,程序生成的JSON通常能做到这一点),TEXT类型的完全匹配逻辑和JSON类型的完全匹配效果完全相同。同时TEXT可以直接加入联合索引,充分利用索引的快速查找能力。
额外注意
如果存在JSON生成格式不统一的风险(比如不同场景生成的JSON键顺序不同,但内容等价),可以在存储前对JSON做标准化处理——比如按键名排序后再序列化存储,确保等价的过滤条件能被正确匹配。
内容的提问来源于stack exchange,提问作者Gabriel Henrique

