索引的底层数据结构
mysql中索引分结构分为B+tree和hash两种存储结构
1>.hash:做等值查询("=","IN"和"<=>"查询),不能用做顺序范围查询(因为hash计算过后的索引并不一能保证之前的大小关系),数据大量的hash值相等容易hash碰撞(hashMap通过链地址法解决,后加入变换红黑树);组合索引:不支持模糊匹配(hash值是通过对组合索引计算的)
2>.B+tree:每个叶子节点才存储数据,其他节点存储索引,叶子节点按照从小到大范围排序,可以做范围查询
B-tree和B+tree区别:
(1).B-tree所有节点既放key也放value,而B+tree只有叶子节点放key-value,其他节点只放key
(2).B-tree所有叶子节点都是独立的,而B+tree叶子节点有一条引用链指向相邻节点
(3).B-tree的检索是做二分查找,可能没到叶子节点已经结束,而B+tree每次都需要检索到叶子节点,B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速.
(4).
索引类型
(1)主键索引:一个表只能有一个主键,且不能为null,不能重复,主键列使用主键索引;当没有显示指定主键的时候,则寻找唯一索引字段当主键,否则 InnoDB自动创建 6Byte的自增主键
(2)二级索引(辅助索引)
二级索引的叶子节点存储的都是主键的值,可以定位到主键
聚集索引与非聚集索引
InnoDB使用聚集索引,即数据和索引存储在同一个文件中;而MyISAM索引文件和数据分离
非聚集索引不一定回表查询(SQL 查的就是主键时不需要)
覆盖索引
覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了, 而无需回表查询