前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进阶-联合索引

进阶-联合索引

原创
作者头像
技能锦囊
修改2020-05-26 14:28:30
4650
修改2020-05-26 14:28:30
举报
文章被收录于专栏:MySQL 笔记MySQL 笔记

单字段索引不能满足你了,那就多来几个...

创建普通索引的时候,指定两个或更多的字段

这就是联合索引,语法如下

代码语言:txt
复制
alter table 表 add index 索引名(字段1,字段2)

维护数据库时发现现索引重复了?

这时可以删掉重复的索引,释放内存空间,提高查询效率

代码语言:txt
复制
#因为联合索引(A,B)相当于创建了(A)和(A,B)索引  

KEY idx\_Id (Id)  

KEY idx\_Id\_age (Id, age)  

#所以这里可以删除Id 这个索引;
使用联合索引时,注意索引列的顺序,要遵循 **最左匹配原则**
代码语言:txt
复制
联合索引 "idx\_id\_age " ,id在前,age在后  

#符合最左匹配原则

select \* from user where id=10 and age =10;

#符合最左匹配原则

select \* from user where id =10;

#age在前就不符合最左匹配原则,即不会用到索引

select \* from user where age =10 and id =10;

当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。

如果遇到了范围查询,比如(<)(>)和 between 等,

会停止匹配,那后面的列就不会用到联合索引了。

代码语言:txt
复制
where k1 > 1 AND  k2  = 2   AND  k3 = 3

#这里k1 使用了范围查询,所以后面的k2,和k3 列就不会使用到联合索引了

这里有几条SQL语句,说说它们分别用到了哪个索引呢?

代码语言:txt
复制
1.SELECT x, y, z FROM table WHERE y=2 AND x>1 AND z=3



2.SELECT x, y, z FROM table WHERE y=2 AND x=1 AND z>3



3.SELECT x, y, z FROM table WHERE y=2 AND x=1 AND z=3



4.SELECT x, y, z FROM table WHERE y>2 AND x=1 AND z=3

结果是 :这四条语句都会用到索引。

代码语言:txt
复制
1: WHERE y=2 AND x>1 AND z=3 -- 使用索引(x,y,z)的x列。

#x是范围列,索引列最多作用于一个范围列,范围列之后的y列和z列无法使用索引。



2: WHERE y=2 AND x=1 AND z>3 -- 完整使用索引(x,y,z)。



3: WHERE y=2 AND x=1 AND z=3 -- 完整使用索引(x,y,z)。



4: WHERE y>2 AND x=1 AND z=3 -- 使用索引(x,y,z)的x列和y列。

#y是范围列,索引列最多作用于一个范围列,范围列之后的z列无法使用索引。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用联合索引时,注意索引列的顺序,要遵循 **最左匹配原则**
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档