为什么选择B+树
我们都知道哈希索引,但是并没有采用它,因为哈希索引在存储的时候是通过了hash值来进行存储,hash值是无序的,不能进行范围查找。还有就是进行排序的话也不能使用哈希索引。因为想UUID一样是无序的东西。
平衡二叉树
只能存储两个结点,数据量很大的情况下,树的高度会非常的高,查询数据时就会很慢。
另外当我们查找id>的数时,首先要定位到5,然后回旋查找,效率很慢
B树
树的高度相对于二叉树 高度降低,树更加粗壮,查找效率得到提升,但是对于id>5的问题,仍然需要先定位到5,然后进行回旋查找。
B+树
叶子结点通过单项链表进行连接,用于解决回旋查找的问题。
非叶子结点只存储key,叶子结点存储了 key和value。
索引为什么会失效
在联合索引中有以下特点
1、a是有序的
2、当a固定时,b也是有序的
所以联合索引就是先通过a字段进行排序,然后再通过b字段进行排序。
从而,在使用联合索引时要注意最左匹配原则。
select * from table where a = ‘1‘ and b = ‘3‘
这是使用到索引的
因为先对a进行排序,然后对b进行排序。
先查找到a后b也就是有序的了,所以就用到了索引
select * from table where b > ‘3‘
这没有使用到索引
因为b只有在a固定的情况下才是有序的,这个把a干掉了,b就是无序的,只能进行全表扫描
select * from table where a > ‘1‘ and b = ‘3‘
这没有使用到索引
查找到a>1后,b是无序的,所以不能通过二分查找查找b的数据,只能进行全表扫描。
a = 1的话就可以
select * from table where a like ‘%1‘ and b = ‘3‘
like 百分号放在左边的话就用不到索引
字符串排序是根据从前到后的字母顺序进行排序的,这样的话就不是有序的,就用不到索引
如何通过索引定位到一条数据
InnoDB与MyISAM的区别
MyISAM | InnoDB | |
---|---|---|
事物 | 不支持 | 支持 |
外键 | 不支持 | 支持 |
索引 | 非聚集索引 支持FullText类型的全文索引 | 聚集索引 不支持FullText类型的全文索引,但是可以通过sphinx插件进行实现,并且效果很好 |
锁粒度 | 最小是表级锁 | 最小支持行级锁 |
硬盘存储结构 | .frm存储表的定义 .MYD存储数据文件 .MYI存储索引文件 | Frm存储表的定义 Idb存储数据和索引文件,数据以主键进行聚簇存储,真正的数据存储在叶子结点中 |
聚簇索引和非聚簇索引
聚簇索引(InnoDB)
就是将数据与索引存放在一起,索引结构的叶子结点保留了行数据
表中的数据按照索引的顺序来进行存储,也就是索引项的顺序与表中记录的物理顺序一致。
其他索引成为辅助索引,根据建立索引的字段存储相应的id值 如根据name建立索引,那么久存储name以及对应的id值。
聚簇索引默认是主键
如果没有主键,就选择一列唯一的非空列作为聚簇索引
如果没有这样的列,就会生成一个GEN_CLUST_INDEX的隐式聚簇索引
非聚簇索引(MyISAM)
数据与索引分开进行存储
MyISAM都是先通过数据找地址,然后根据地址找数据。
通过辅助索引首先查找到对应的id,然后再根据主索引通过id进行数据查找。所以要经过两次查找,也就是所谓的回表。对于查询频率很高的数据字段,建议进行覆盖索引,如通过name查找手机号以及地址这样的请求频率很高,我们可以建立一个 name phoneNum address 这样的一个联合索引,避免了回表。