数据库:索引篇

索引结构

二叉树

由于二叉树有缺点(顺序插入会形成链表,层级太深),所以使用红黑树,来解决树的平衡问题。

因为红黑树是自平衡的二叉树。

红黑树也会在数据量大的情况层级较深,检索速度也慢。

B Tree(多路平衡查找树)

用B Tree来解决红黑树在数据量大的时候层次变深的问题,本质上B tree是多叉树,而且也能自平衡。

B+Tree

B+树在B树的基础上:

1、增加了一个指向相邻叶子节点的双向链表,能增强区间访问的性能;

2、把数据存储的位置从所有节点限制到只在叶子节点存储,那么非叶子节点能存储的“页”、指针可以更多,这样可以让整个树变得更扁平,检索的次数更少。

PS:一个页默认是16K,固定大小

哈希Hash

特点

1、只能等值匹配(=,in),无法进行范围查询(between,<,>)

2、效率高,只要不发生哈希冲突,只需要一次检索就能得到结果。

存储引擎支持

在MySQL中,只有Memory引擎支持Hash索引。

索引分类

重点:

举例分析

聚集索引:默认用主键(id)建立聚集索引,结构为B+Tree,在叶子节点下方挂的数据就是该id本行的数据。

二级索引:对name属性建立二级索引,按字典序排序,结构也是B+Tree,叶子节点下挂的数据不是本行的数据(与聚集索引重复,会造成冗余),所以设计成挂的是主键的id值。

回表查询

先走二级索引,查到对应的主键值。再走聚集索引,查到具体的行数据。

举例:select * from user where name = 'Arm'

思考:

设n为:一页中有n个key,那么n+1就是一页中指针的个数。(一页就是树中的一个结点)

索引的使用

联合索引右侧字段失效

联合索引:最左前缀法则

在select语句中,三个字段的联合索引是否生效,遵循最左前缀法则,具体体现在where条件中。

联合索引:范围查询失效

profession、age、status三个的联合索引,遵循最左前缀法则,如果中间的age字段在select中使用了范围查询,那么age会失效,后面的status也会失效。

例外情况:中间的age字段在select中使用“大于等于”或者“小于等于”,这时候索引并不失效。

索引失效情况一:在索引上做运算

索引失效情况二:字符串不加引号

在where条件中搜索phone=12345,字符串没有加引号,不走索引;

在where条件中搜索phone='12345',字符串加了引号,走索引。

索引失效情况三:模糊查询

如果是头部模糊查询不会失效(头部固定、后面模糊);

但是对尾部模糊匹配就会失效(尾部固定、头部模糊)。

索引失效情况四:or条件连接

假如以下:id字段和phone字段有索引,age没有索引。

索引失效情况四:索引效率低于全表扫描

比如一个范围查询,查询某字段大于某个值的数据,实际上,大于这个值的结果占据了全表的70%,那么Mysql认为走全表扫描效率会更高。索引会失效。

总结

也就是说,如果select语句查询到的结果,能占据全表的绝大部分数据。那么Mysql会认为索引效率还不如全表扫描快,索引就会失效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值