MySQL能否为逗号分隔字符串列创建Multi-Valued Indexes优化FIND_IN_SET性能?
MySQL多值索引能否优化逗号分隔字符串列的FIND_IN_SET查询?
不行,MySQL的多值索引仅支持JSON数组列,没办法直接给CHAR/VARCHAR类型的逗号分隔字符串列创建这类索引来提升FIND_IN_SET的查询性能。
多值索引的创建逻辑依赖将列CAST为数组类型,但逗号分隔的字符串无法直接通过CAST转换为MySQL可识别的数组结构——只有JSON列能完成这种数组类型转换,所以这类字符串列没法直接用上多值索引。
针对你管理10000个数据库、150万张带逗号分隔列的表这种大规模场景,比起创建副表的复杂方案,更简单的替代方法是用生成列将逗号分隔字符串转为JSON数组,再给生成列创建多值索引:
操作示例
- 给现有表添加自动同步的JSON数组生成列:
ALTER TABLE customers ADD COLUMN zip_json_gen JSON GENERATED ALWAYS AS (CONCAT('[', zip_string, ']')) STORED;
这个生成列会自动同步zip_string的内容变化,无需手动维护。
- 给生成列创建多值索引:
CREATE INDEX idx_zip_json_gen ON customers ((CAST(zip_json_gen AS UNSIGNED ARRAY)));
- 查询时用
MEMBER OF或JSON_CONTAINS,性能和原生JSON列一致:
SELECT * FROM customers WHERE 10005 MEMBER OF(zip_json_gen); SELECT * FROM customers WHERE JSON_CONTAINS(zip_json_gen, '10005');
这种方案不需要修改原有业务的写入逻辑,也不用维护额外的副表,能快速批量应用到大量库表中,同时把查询耗时从FIND_IN_SET的120ms级降到1ms级。
内容的提问来源于stack exchange,提问作者Liubarskis
相关产品推荐
相关产品推荐

