利用索引,可以缩小搜索的范围,加快查询速度,但使用一个具有两列的联合索引不同于使用两个单独的索引。
多个单列索引在多条件查询时优化器会优先选择最优索引策略,可能只用一个索引,也可能将多个索引全用上。但多个单列索引底层会创建多个B+索引树,比较占用空间,也会浪费一定搜索效率,故如果只有多条件联合查询时最好建联合索引。
建立联合应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,联合索引非常有用;仅对后面的任意列执行搜索时,联合索引则没有用处。
例如建一个my_user表表
CREATE TABLE my_user(
user_name VARCHAR(32),
email VARCHAR(32),
phone VARCHAR(32)
)
创建联合索引:
ALTER TABLE my_user ADD INDEX idx_name_email_phone(user_name,email,phone)。
相当于创建了(user_name)、(user_name,email)和(user_name,email,phone)三个索引,这就是最左匹配原则。
- 满足复合索引的最左特性,哪怕只是部分,复合索引生效:select * from my_user where user_name="myName"。
- 没有出现左边的字段,则不满足最左特性,索引失效:select * from my_user where email="myEmail" and phone="myPhone"。
- 复合索引全使用,按左侧顺序出现,索引生效:select * from my_user where user_name="myName" and email="myEmail" and phone="myPhone"
- 虽然违背了最左特性,但MySQL执行SQL时会进行优化,底层进行颠倒优化,索引生效:select * from my_user where email="myEmail" and phone="myPhone" and user_name="myName"