索引

1.什么是索引?

索引是帮助数据库高效获取数据的数据结构,本质是通过排序来快速查找

除了数据,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据的地址(硬盘位置),这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

索引本身也很大,不可能全在内存中,所以往往也以索引文件的形式保存在磁盘上。

 

2.索引的作用?

排序 order by,搜索条件 where。

 

3.索引的数据结构是什么?

一般都是B+Tree(多路搜索树,不一定是二叉的),也有hash索引,full-text全文索引,r-tree索引。

 

4.索引的优势

  4.1 类似图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本;

  4.2 通过索引列对数据进行排序,降低了数据排序的成本,降低了cpu的消耗。

 

5.索引的劣势

  5.1 索引其实也是一张表,存储了主键和索引字段,并指向实体表的记录,因此索引也是要占用空间的;

  5.2 索引提高了查询速度,但是会降低写的操作,insert,update,delete等,因为这种操作会更新索引;

  5.3 索引本身不是一劳永逸,需要根据需求的变化维护,提高了这块的成本。

 

6.索引的分类
  6.1 单值索引:只包含一个列的索引,一个表可以有多个单列索引;

  6.2 唯一索引:值必须唯一,但是可以为空;

  6.3 复合索引:一个索引包含多个列,比较推荐使用,因为现在很少有单条件查找的情况。

 

7.索引原理(B+Tree)

  

 

 B+树,浅蓝色为磁盘块,每个磁盘块都有深蓝色的数据项和黄色的指针,如磁盘块1有数据项17,35和指针p1,p2,p3。

p1表示小于17的磁盘块2,p2表示17-35之间的磁盘块3,p3表示大于35的磁盘块4。

真实的数据,3,5,9,10,13,15....存在于叶子节点,非叶子节点存储的不是真实的数据,而是引导搜索方向的数据项,如17,35。

已查找29为例,首先加载磁盘1,发生1次IO,判断出29在17和35之间,于是锁定磁盘1的指针p2,通过磁盘1的p2指针的磁盘地址加载磁盘3,发生第2次IO,判断29在26和30之间,锁定磁盘3的指针p2,加载磁盘8,发生第3次IO,同时内存做二分查找查到29,结束查询,一共发生了3次IO。

 

8.索引适用的场景

  8.1 主键自动是唯一索引;

  8.2 频繁作为查询条件的字段;

  8.3 频繁作为排序的字段;

  8.4 查询中统计或分组的字段;

  8.5 与其他表的关联字段。

 

9.索引不适用的场景

  9.1 记录很少的表,几百上千万把条的,不需要特意建;

  9.2 经常增删改的字段;

  9.3 大量重复值的字段,没有意义,例如国籍,性别,省份这种。

 

posted @ 2020-12-28 15:08  luytest  阅读(156)  评论(0编辑  收藏  举报