Mysql使用虚拟列建索引提升查询性能

使用虚拟列绕过最左匹配,减少查询行数,提升性能

假设有一张t_people表,有组合索引(name, age),若name是「李」开头的有许多,则以下查询依然会很慢:

select * from t_people where name like '李%' and age = 8;

解决方法:可以创建一个「虚拟列」(Mysql 5.7+版本支持)name_first,存储name的第一个字,并使用此虚拟列建组合索引:

alter table t_people add name_first varchar(2) generated always as (left(name, 1)), add index(name_first, age);

修改后的查询语句:

select * from t_people where name_first = '李' and age = 8;