索引定义:
排好序的数据结构,用来查询时更快找到结果
索引类型
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)速度快。