什么是索引?
数据库索引是数据库中一块单独的,物理的数据结构,可以对一列或多列创建索引,那么索引中保存的就这些咧的值以及其所对应的数据行指针,指针指向的是表中某条数据的位置。
索引有自己的数据结构,来对数据进行排序,常用的数据结构有:二叉树、BTree、B+Tree,hash
索引为什么快?
索引类似于字典,如果对于拥有大量数据的表查询。
没有索引的时候会做全表扫描:也就是将数据一页页的查看,直到匹配到条件之后将此条数据放到返回结果集中,如果数据量大这种方式会特别慢。
创建了索引好似字典的音标,查询某条数据不需要将表中每条数据进行一遍查询,只需要对索引列进行遍历,找到符合条件的数据然后根据指针找到具体某条数据,在遍历索引的时候速度会非常快,因为索引有自己独特的数据结构。
创建索引相比于不创建索引有两个大的优势:
1.硬件方面:就是磁盘io,无索引时会对表中的每一条数据进行读取,数据量大会导致磁盘io时间过长,但是有索引时只需要对某些列进行读取,读取到符合筛选条件的数据后根据指针找到相应的数据,这可以大大减少磁盘io时间
2.软件方面:无索引时是在表中无规律的每一条的搜寻符合条件的数据,但是创建索引,会对索引列进行排序,在遍历索引的时候是有规律的进行查找,可以少走很多的弯路
Btree索引的数据结构和查询逻辑:
定义:
1.允许每个节点至少有2个元素。
2.每个节点的最多有M-1个元素
3.每个节点有k个子节点并且有k-1个元素
4.所有叶子节点都在于同一层
5.元素的排列大小是从左往右从小到大
6.元素的值会放在叶子节点上
优点:
相比二叉树,Btree的每个索引页都能存放更多的元素,虽然增加了每层元素的遍历成本,但是相较于io切换,内存中的遍历成本可以忽略不记。
插入数据:
会从树的最上层往下面查找,直到找到将要插入元素的位置,如果因为要插入这个元素会破坏树的规定,会一层层往上层推直到找到合适的地方插入进去。
删除数据:
删除某一个会破坏规定,比如一个节点12,有两个子节点,左边是11,右边是13,15,现在要删除11,那么这将破坏每个节点至少两个元素这一规则,那么寻找剩下节点的中位数,12,13,15的中位数是13,由13当节点,其余两个当叶子节点
索引失效
1.用not in 或者 not exit
2.对索引列使用了函数处理
3.对索引列使用了计算
4.对索引列使用左模糊查询
5.条件中使用or,然后条件之一不是索引列