mysql索引概述

本文草稿与三月初创作,但是由于刚换新工作比较忙,因此没及时完成并发表。

索引的主要作用是加快数据的查找,但是索引本身也是需要存储的,由于索引文件可能很大,因此不能常驻内存,在用到的时候需要从硬盘种加载,常识性我们都知道,计算机io是非常耗时的操作,那么如何减少io便是索引设计的重点。


mysql的索引使用的是b+树(数据结构不详细介绍,请自行查阅资料),那么为什么要用b+树,不用b-树或者红黑树。假设树每访问一层需要一次io,那这样首先把红黑树给排除掉。再来对比b-tree和其变形b+tree,首先b-tree路由节点也可能保存数据本身,这就导致同样大小的路由节点保存的路由信息就会减少,一个节点的数据太大,一次io读取不了完整的节点信息,那么就需要多次io耗时增加。由于b+tree路由节点只保存路由信息,那么相同的空间能放更多的路由信息,这也就意味着更少的io。

mysql索引属于存储引擎,不同存储引擎实现方式不同。


MyISAM引擎使用b+tree作为索引,叶子节点data存放的是记录地址。MyISAM中主索引与辅助索引形式是一样的,主索引要求key不能重复,辅助索引key可以重复。这种索引方式叫非聚集索引。


InnoDB引擎,与MyISAM索引与数据分开存放不同的是,InnoDB引擎数据文件本身就是一个索引,InnoDB引擎数据存放是按b+tree结构组织存放的,叶子节点包含全部的数据信息,这个树的key就是主键,这样的设计会导致数据按照主键聚集,所以这种方式叫聚集索引,正是因为这样,InnoDB引擎要求表必须有主键,这样的设计可以使按主键的查找非常高效。
InnoDB引擎辅助索引叶子节点存放的是主键,正式这个设计,所以不建议主键使用长字段,因为会导致辅助索引data占用空间太大。


最左前缀
现在假设有一个表Table1 ,含有A,B,C,D,E五个字段
现在建一个联合索引A,B,C
什么时候能用到这个索引呢
全部使用
where A=1 AND B=1 AND C=1(where C=1 AND B=1 AND A=1...)
这个时候是可以用上的,三个都用上
使用左边两个
where A=1 AND B=1 (where B=1 AND A=1)
使用左边一个
这个时候也能用上,用上两列
where A=1 AND C=1 (where C=1 AND A=1)
这个时候也能用上,但只能使用A
缺少最左边一个
where B=1 AND C=1(where C=1 AND B=1)
这个时候用不上
剩下情况不一一举例
结论是从最左边匹配,条件中能从最左边连续匹配几个就能用到几个。

范围查询
范围会用到索引吗?会,不过在范围字段后的列就不再使用索引。
例如 
SELECT * FROM TABLE1 WHERE A=2 AND B<3 AND C=2
这种情况只能使用索引A,B。
同理两个连续的范围也只能使用上第一个匹配的范围索引,如下
SELECT * FROM TABLE1 WHERE A=2 AND B<3 AND C<3
只能使用A,B。


like会用到索引吗
只要like中的通配符不出现在最左端就能使用索引。


查询条件中有函数会使用索引吗
不会


索引选择性

假设有100调数据 a列不同的数据有90条,那么选择性为0.9,选择性越接近1索引性能越好。


其实本来在着手写这篇文章时编写思路的把索引相关的东西都讲到,但是由于放了将近一个月的时间,思路完全丢失,想不起来本来打算按哪个线写下去了,以后也长个经验,写文章一气呵成,不然就不写。这篇文章就等慢慢遇到哪点想写就补充到里边吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值