数据库-索引的原理(面试高危之必备技能)

前言

非常有幸通过了支付宝的一轮电面,面试官对我评价较高,题目中设计到了参数集合、数据库优化、索引、线程池、锁、反射等问题。但是对于索引的原理是我知之甚少的,但是非常感谢支付宝面试官对我的引导,让我顺利过关,但是该掌握的知识不能放手,现在来整理数据库-索引的相关知识及原理。

什么是索引?

举个栗子,我们拿出一本新华字典,它的目录实际上就是一种索引:非聚集索引。我们可以通过目录迅速定位我们要查的字。而字典的内容部分一般都是按照拼音排序的,这实际上又是一种索引:聚集索引。

更加具体的内容请移步百度百科:索引-百度百科资料

索引的分类

  • 聚集索引
  • 非聚集索引
  • 哈希索引
  • B+-树索引(二分查找)

索引有什么作用

在数据库系统中建立索引主要有以下作用:

  1. 快速取数据;
  2. 保证数据记录的唯一性;
  3. 实现表与表之间的参照完整性;
  4. 在使用 ORDER BY、GROUP BY 子句进行数据检索时,利用索引可以减少排序和分组的时间。

索引有什么优缺点

优点

  1. 大大加快数据的检索速度;
  2. 创建唯一性索引,保证数据库表中每一行数据的唯一性;
  3. 加速表和表之间的连接;
  4. 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点

  1. 索引需要占物理空间。
  2. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

什么时候使用索引

如果某个字段,或一组字段会出现在一个会被频繁调用的 WHERE 子句中,那么它们应该是被索引的,这样会更快的得到结果。为了避免意外的发生,需要恰当地使用唯一索引,并且我个人不推荐使用全文索引,尤其对于汉字来说,全文索引的开销太大了,得不偿失。
索引至少会带来如下的overhead额外的创建时间额外的存储空间(单列索引占原表5%至15%空间,想象一下如果为一个表创建三四个索引)额外的维护时间这一切只为了一个目的:减少在small range query的情况下的query time。如果是大range query 返回1%以上的数据,这情况下索引的意义不大。

选择什么索引

  • low selectivity 情况下: 比如 parent column 为性别,bitmap index什么的可以考虑。
  • high selectivity 可以用 btree 来维持二分查找的查找效率

写在最后

到现在,你应该对索引有一个具体的认识和运用的体会,凡事有得必有失,而使用的利弊权衡必须有实际的操作才有发言的自由,所以,在这篇文章之后,自行到数据库进行一次十万级数据有索引和无索引的练习吧,祝生活更好!

你可能感兴趣的:(数据库-索引的原理(面试高危之必备技能))