MYSQL 索引详解

索引类型

  1. 索引按照存储结构划分为4类: B Tree(B-tree)、Hash、R-Tree、 Fulltext(MyISAM)
  2. 也可分为聚集索引和非聚集索引

B+tree索引

 1. B Trree(B-Tree): 有序数组+平衡多叉树
 2. B+Tree:有序数组链表+平衡多叉树
 B+Tree更适合排序、范围等操作。B+Tree所有的索引数组都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都有指向相邻叶子节点的指针,提高了区间效率:
 e.g: 范围查找,只需顺着节点和指针顺序遍历即可.而B树遍历复杂.查询复杂

平衡二叉树

平衡二叉树查找的时间复杂度是O(log2N),查找效率和深度有关.普通的二叉树因为排序问题会退化成链表,实际复杂度是O(N).所以平衡二叉树是更好的选择
 但是索引是存于索引文件中,存在磁盘上.所以比较大无法一次加到内存中,因此每次只能从磁盘中读取一个磁盘页的数据到内存.读磁盘速度很慢.所以需要找一个尽可能减少执行磁盘ID操作

B-Tree

   平衡二叉树没有充分利用磁盘预读的功能(局部性原理和磁盘预读)
   内存读写快,磁盘读写慢.慢很多
        局部性原理:数据读取集中与使用一个数据,大概率会使用其附近的数据,而且磁盘的顺序读取效率很高,对于局部性程序来说,预读可以减少IO
   磁盘预读:由于存储的特性,磁盘的存取比内存慢很多,为了提高效率,尽量减少IO,为了达到这个目的,所以磁盘读取不是按需读取,而是按页读取,一次读取一页的数据,每次加载更多的数据
   红黑树:深度大,逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,红黑树的IO渐进式复杂度是O(H). 平衡二叉树每次磁盘预读中很多数据都是用不上,然后深度大,进行很多磁盘IO
   B树: 主要发生在内存中,二叉树发生在磁盘读取中

B+Tree

   关键字存在叶子节点,非叶子节点存储索引,而叶子节点中有一个指针指向下一个也在节点.主要用来提高区间访问的性能
   叶子节点按存储实际记录行,记录行想的比较紧密的存储,适合大数据量磁盘存储,非叶子节点存储记录的PK,用于查询加速,适合内存存储
   非叶子节点,不存实际记录,只存储记录的key,相同内存,B+树能够存储更多的索引

索引失效

1.  查询列中有函数计算
2.  like
3.  有or时,除非所有条件都加上索引
4.  != or <>
5.  is null 或者is not null
6.  字符串不加引号
7.  最左匹配原则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值