聚集索引和非聚集索引
数据库中B+树索引可以分为聚集索引和非聚集索引(辅助索引)
聚集索引
每张表只有一个聚集索引,且是建立在主键上面的。
主键索引
在InnoDB存储引擎中,每张表都有个主键,如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键
首先判断表中是否存在非空的唯一索引,如果有,则该列即为主键
如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针。
联合索引
联合索引在表上的多个列进行索引。
1.联合索引
创建如下的表,并创建一个联合索引(a,b)
CREATE TABLE t(
a INT,
b INT,
PRIMARY KEY (a),
KEY idx_a_b (a,b)
)ENGINE=INNODB
联合索引的B+树如下。通过叶子节点可以逻辑上顺序的读出所有数据,(1,1),(1,2),(2,1),(2,4),(3,1),(3,2)
2.能够使用联合索引的情况
①全匹配
select * from t where a=xxx and b=xxx
②最左前缀匹配
对于单个的a列,也可以用到(a,b)联合索引
select * from t where a=xxx
③不能使用联合索引
叶子节点上b的值为1,2,1,4,1,2,显然不是排序的。
select * from t where b=xxx
同理,如果建立(a,b,c)索引,则下面的查询都能用到索引。
select * from t where a=xxx and b=xxx and c=xxx
select * from t where a=xxx and b=xxx
select * from t where a=xxx
select * from t where b=xxx and c=xxx
3.联合索引可对第二个列进行排序处理,减少一次filesort。
在联合索引(a,b)中,由于a相同的情况下b本来就是排序的,所以下面的查询能够用到(a,b)索引,且不需要额外再进行排序。
select * from t where a=xxx order by b
同理,如果建立(a,b,c)索引,下面的查询也能少一次fileSort。
select * from t where a=xxx and b=xxx order by c
select * from t where b=xxx order by c
select * from t where a=xxx order by b
喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群(374308445)来交流学习,里面都是同行,群验证【优快云2】有资源共享。