Mysql覆盖索引

复合索引

创建索引的时候可以选择多列,这样的索引叫复合索引;例如

CREATE TABLE `account4` (
  `id` bigint(20) DEFAULT NULL,
  `name` varchar(6) DEFAULT NULL,
  `balance` decimal(10,0) DEFAULT NULL,
  primary key idx_id(id),
  key idx_name_balance(name,balance)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入一行数据

insert into account4 value (1,'jim',33);

这里的 idx_name_balance 便是一个复合索引

覆盖索引

那么什么是覆盖索引呢?附一张《高性能mysql》里的一页信息,从截图里可以看出覆盖索引我们可以称之为工具,它的发生场景是:我们的查询条件和输出的字段是一个复合索引列的子集;

以account4表为例子,

select name,balance from account4 where name = 'jim' and balance = 33;

便是一个覆盖索引查询,因为name和balance都在查询输出列并作为where过滤条件,我们可以通过执行计划看出来:执行计划的Extra 有Using index则就是覆盖索引的标记

增加一个条件

主键列表作为输出

我们修改一下select语句,新增一个id

有人可能会问,按照定义这个应该不是覆盖索引场景,因为输出列多了一个id;

但是主键是一个特殊的存在,我们建立的二级索引在存储的时候是会连同该行的主键值一起存储的,只要查询的列只需要通过扫描索引而不需要二次索引查询获得就叫做覆盖索引;

覆盖索引很大程度上提高了查询效率

主键列作为条件

我们再修改一下sql

有的同学会问,这种情况如果按照上面的描述,应该就是一个覆盖索引场景了;但是mysql在分析执行计划的时候,发现有主键列参与了where过滤,那么这个查询就会优先走主键索引就无需二次索引(即通过二级索引先找到主键,再根据主键索引去查询真实数据);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值