Mysql索引数据结构

索引定义:

排好序的数据结构,用来查询时更快找到结果

索引类型

1.B+Tree

默认使用B+Tree,对于频繁访问的数据会在建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的

2.Hash

索引的数据结构:

尽管有多种数据结构可以选择,但是各有弊端

1.二叉树

不能够做到树节点平衡,如果是自增索引插入,那么就完全退化成了链表结构,时间复杂度在[O(logN),O(N)]之间

2.红黑树

不能控制树的高度,不支持大量数据存储,如果有100W数据那么树的高度= log2100w(树的高度等于查询时的IO次数),时间复杂度为O(logN)。

3.Hash表

范围查询只能按顺序查,范围查找O(N),精确查找O(1)。

4.B-Tree(读作B树)

多路平衡查找树,索引值存放在非叶子节点或叶子节点,所有的索引值只会在树中出现一次。范围查询时候,如果数据在不同的叶子节点,那么就需要查多次。

5.B+Tree

基于B-Tree改进的,叶子节点存放了所有索引值,相邻叶子有双向指针,非叶子节点冗余了部分索引值。


为什么不建议Mysql单表数据超过2000W?

因为Mysql索引使用B+Tree,而树的每个节点官方默认为16k,每个节点有个度(Degree)的最大数量,这个最大数量指的是这个节点可以存放的索引的个数,一个索引假设8byte+6byte(指针)=14bye,那么只能存放1170个索引。一般索引层数在1~4之间,如果是三层结构,可存放的索引数量= 1170x1170x16(叶子节点每条数据1k)~= 2000w。如果数据过过会导致树裂变为更多层增加IO次数。


联合索引底层存储结构?

联合索引和单列索引相似,但是节点里的索引是(a,b,c)的组合,匹配时从左匹配,只要最左的索引使用了,就能使用联合索引,(a,c)这样也能使用但是因为范围大所以没有(a,b)速度快。

为什么Myisam比InnoDB速度快?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值