当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-什么是联合索引,组合索引,复合索引?

金三银四精选java面试题-什么是联合索引,组合索引,复合索引?

来源:图灵教育
时间:2024-01-10 09:58:35
 

什么是联合索引,组合索引,复合索引?

 

我们在索引回顾的时候和大家对索引做了一个分类对吧,按照字段个数来分的话,就分为了单列索引和组合索引对吧。那么他们之间的特点是什么呢?我们来看

 

  • 单列索引 一个索引只包含了一个列,一个表里面可以有多个单列索引,但是这不叫组合索引。
  • 组合索引(联合索引 & 复合索引)一个索引包含多个列。

 

看上去感觉这组合索引并没有太大作用是吧,我一个列已经有一个索引了,我还要这组合索引干嘛?

 

真相往往不那么简单,首先我们得承认我们的业务千变万化,我们的查询语句条件肯定是非常多的。

 

  • 高效率 如果说只有单列索引,那就会涉及多次二级索引树查找,再加上回表,性能相对于联合索引来说是比较低的。
  • 减少开销 我们要记得创建索引是存在空间开销的,对于大数据量的表,使用联合索引会降低空间开销。
  • 索引覆盖 如果组合索引索引值已经满足了我们的查询条件,那么就不会进行回表,直接返回。

 

但是我们按照我们的查询条件去创建一个联合索引的话,就避免了上面的问题。那么联合索引是怎么工作的呢?

 

这里涉及到了一个重点,叫做最左前缀,简单理解就是只会从最左边开始组合,组合索引的第一个字段必须出现在查询组句中,还不能跳跃,只有这样才能让索引生效,比如说我查询条件里面有组合索引里面的第二个字段,那么也是不会走组合索引的。举个例子

 

// 假设给username,age创建了组合索引

// 这两种情况是会走索引的
select username,age from user where username = '张三' and age = 18;
select * from user where username = '张三';

// 这种是不会走索引的
select * from user where age = 18;
select * from user where city = '北京' and age = 18;

 

复合索引创建时字段顺序不一样使用效果一样吗?

 


// 特殊情况,这种也是会走索引的,虽然我的age在前面,username在后面。
// 刚刚不是手最左前缀匹配吗,为什么放到第二位也可以呢?
// 虽说顺序不一致,但是在SQL执行过程中,根据查询条件命中索引,
// 无论我username在不在前面,都会按照username去进行索引查找。
select * from user where age = 18 and username = '张三';