索引结构
二叉树
由于二叉树有缺点(顺序插入会形成链表,层级太深),所以使用红黑树,来解决树的平衡问题。
因为红黑树是自平衡的二叉树。
但红黑树也会在数据量大的情况层级较深,检索速度也慢。
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会认为索引效率还不如全表扫描快,索引就会失效。