覆盖索引和联合索引

覆盖索引联合索引是数据库中常⻅的两种索引类型

覆盖索引

覆盖索引是指⼀个包含了所有查询需要的列的索引,查询时可以直接从索引中取到需要的数据⽽不需要再回到表中查找,从⽽可以提⾼查询效率

如下建立覆盖索引

CREATE INDEX orders_idx ON orders (order_no, create_time, total_amount);

其中,orders_idx是索引的名称,orders是表名,order_no、create_time和total_amount是需要建立索引的字段名。

当我们需要查询订单号为某个值的订单数据时,可以使用以下 SQL 查询语句,来查询符合条件的订单数据,并使用该覆盖索引进行优化:

SELECT order_no, create_time, total_amount 
FROM orders WHERE order_no = '123456';

联合索引 

联合索引是指使⽤多个列组合起来作为⼀个索引,可以同时查询多个列

CREATE INDEX info ON infomation (name,age,position);
explain select * from t where name=‘Bill’ and age=40 and position=‘dev’

联合索引 = 聚合索引 = 组合索引

联合索引可以包含多个列,但是查询时只能使⽤前缀列进⾏查询,即只有在查询中使⽤了联合索引的前⼏个列,才能利⽤联合索引进⾏查询。如果查询中没有使⽤前缀列,那么联合索引就不能发挥作⽤,需要使⽤单独的索引或全表扫描。

最左前缀匹配原则

对于联合索引,MySQL会一直向右匹配,直到遇到范围查询(< 、>、between、like等)就停止匹配。例如表有联合索引(a,b,c),只有a、ab、abc类型的查询会走这个索引,⽽不能只使⽤ B 或 C 进⾏匹配。这是因为如果查询时使⽤的列不是最左前缀列,那么 MySQL 就⽆法使⽤索引进⾏查询,会导致全表扫描,从⽽降低查询效率

-- 只有a走联合索引
select * from table where a>1 and b=2 and c=3
-- 不会走联合索引,这里没有给出a的约束
select * from table where b=2 and c=3

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值