MySql的索引

一、什么是索引?
一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。请记住记住这一点:索引是一种数据结构 。
创建索引的目的:用于提高数据库表的数据访问速度的。
既然索引是为了提高数据库的查询效率,那么是不是数据库中的表的字段都需要建立索引呢???
肯定不是的!
哪些情况需要建索引:
1) 主键,唯一索引
2)经常用作查询条件的字段需要创建索引
3)经常需要排序、分组和统计的字段需要建立索引
4) 查询中与其他表关联的字段,外键关系建立索引

哪些情况不要建索引:
1)表的记录太少,百万级以下的数据不需要创建索引
2) 经常增删改的表不需要创建索引
3) 数据重复且分布平均的字段不需要创建索引,如 true,false 之类。
4) 频发更新的字段不适合创建索引
5)where条件里用不到的字段不需要创建索引(创建索引主要针对where后面的字段)
索引放入的分类:
①聚集索引,表数据按照索引的顺序来存储的。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。
② 非聚集索引,表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,该层紧邻数据页,其行数量与数据表行数据量一致。
③ 在一张表上只能创建一个聚集索引,因为真实数据的物理顺序只可能是一种。如果一张表没有聚集索引,那么它被称为“堆集”(Heap)。这样的表中的数据行没有特定的顺序,所有的新行将被添加的表的末尾位置。
④辅助索引(非主键列建立索引) 叶子结点存放的是该字段和对应的key(主键)
二、索引的实现原理
索引的底层实现使用B+树。
简单来说就是首先对创建索引的字段建立索引文件。当用到索引时,把索引和对应的数据,放在B+树的叶子结点上,这样就使得查询速率非常快。
三、为什么索引使用B树?
索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。B树适合这种要求。

从操作系统分析:
操作系统—->磁盘—->磁盘块(4K)
(1)B树的一个结点刚好存储了一个磁盘块的数据,B+树存的关键字更多。
好处:一次磁盘IO就可以把磁盘上的数据取出来而不用多次磁盘IO进行读取
(2)B树适合在磁盘等直接存储设备上组织动态查找表,文件的组织方式便是B树或B+树
四、为什么说B+比B树更适合实际应用中操作系统的文件索引和数据库索引?
(1)B+的磁盘读写代价更低 B+的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。
(2)B+tree的查询效率更加稳定 由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
(3)由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值