mysql如何使用索引_MySQL是如何使用索引的

闲扯

很多时候我们面对很慢的查询的时候会一筹莫展,这个时候大部分人都会很自然的想到建索引这条路。

事实上索引确实是个很好的优化方式,一个良好的索引能够提升不止一倍的效率,还能带来并发能力的提升。

但是索引也不是万能的,不然的话我大可以给一张表的所有列上都加上索引,但是基本上所有的DBA都会有一条认知--不要盲目加索引。

那么如何给一个表加索引,这其实是个很复杂又很简单的问题,首先我们需要了解索引。

一个案例

新建一张表:

create table testc

(

a int primary key auto_increment,

b int,

c int,

d int,

e varchar(20),

key (b,c,d)

);

插入几条数据:

insert into testc values (4,3,1,1,'d');

insert into testc values (1,1,1,1,'a');

insert into testc values (8,8,8,8,'h');

insert into testc values (2,2,2,2,'b');

insert into testc values (5,2,3,5,'e');

insert into testc values (3,3,2,2,'c');

insert into testc values (7,4,5,5,'g');

insert into testc values (6,6,4,4,'f');

此时可以画出索引和数据列的关系简图:

这里数据是按照堆表的形式画的,实际上InnoDB引擎的表是按照聚簇索引组织的,但是这不是本文的重点。

如果执行下面这条SQL,将会如何选择索引:

select * from testc where b >= 2 and b < 8 and c > 1 and d != 4 and e != 'a';

首先明确索引的最左前缀原则,此时索引扫描的下界是由b确定的,根据“b>=2”这个条件可以确定下界是[2,2,2]这个索引记录。

接下来确定上界,上界由>,=这种符号确定,因此观察到b<8这个条件,可以确定上界是[8,8,8]这个索引记录,因此索引的扫描范围一定是[[2,2,2],[8,8,8]),注意是左闭右开区间。

然后需要确定有哪些条件可以在索引上进行筛选,此时需要关注c和d上的条件,c>1代表可以排除掉[3,1,1]这个索引,而d!=4则可以排除掉[6,4,4]这个索引,因此此时需要扫描的索引行只有[2,2,2],[2,3,5],[3,2,2]和[4,5,5]。

在完全确定了索引可以做的事情之后,就要看看哪些条件不能使用索引,此时关注到e!=’a’这个条件,这是没有办法在索引上进行的,只能定位到具体的记录上进行筛选。那么此时就需要进行回表操作了。

这里引申出几个概念如下:Index Key:用于确定SQL查询在索引中的连续范围(起始范围+结束范围)的查询条件,被称之为Index Key;

Index Filter:在完成了Index Key的提取后,索引列上的筛选条件;

Table Filter:所有不属于索引列上的筛选条件。

而IndexKey中又有上下界的概念,用于确定索引扫描的范围,因此可以细分为Index First Key和Index Last Key。

Index First Key:

从索引的第一个键值开始,检查其在where条件中是否存在,若存在并且条件是=、>=,则将对应的条件加入Index First Key之中,继续读取索引的下一个键值,使用同样的提取规则;若存在并且条件是>,则将对应的条件加入Index First Key中,同时终止Index First Key的提取;若不存在,同样终止Index First Key的提取。

Index Last Key:

从索引的第一个键值开始,检查其在where条件中是否存在,若存在并且条件是=、<=,则将对应条件加入到Index Last Key中,继续提取索引的下一个键值,使用同样的提取规则;若存在并且条件是 < ,则将条件加入到Index Last Key中,同时终止提取;若不存在,同样终止Index Last Key的提取。

又见二分查找

注意前文中的这句话:首先明确索引的最左前缀原则,此时索引扫描的下界是由b确定的,根据“b>=2”这个条件可以确定下界是[2,2,2]这个索引记录。

这不就是在一个有序的序列上找一个key吗?那不用二分查找用什么?

其实在InnoDB内部不仅仅是索引扫描的时候用到了二分查找,在页面的槽管理中也是要用到二分查找的。

所以一定要掌握二分查找。

闲扯

这次的题图是一道红色闪电。

愿我们的国家的核心技术有一天像一道红色闪电,劈在美帝的头上。

愿从这次芯片时间以后痛定思痛,不再受制于美帝国主义。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值