开篇
数据库的查询语句,一般是数据库的核心,那么再大量数据,多张表的时候,怎么保证你的效率最快呢?以及后期的维护中,怎么有效的提升你的数据库效率呢?
- 通过有效的高质量的sql语句
- 减少适当的join语句
- 创建索引
- 优化服务器的缓存之类
目录
- 什么是索引
- 索引的优势
- 索引的劣势
- 索引结构初步分析
- 什么场合时候创建索引
- 什么场合不适合创建索引
什么是索引
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
以上解释来自百度百科
可以看出,其实索引就是一种存储结构,也就是一种数据结构,其实我们可以简单的理解,
索引就是排好序的快速查询的数据结构
结论:数据本身之外,数据库还维护者一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引
索引分类
- B树
- B+树
- 哈希索引
- 。。。。。。。
索引的优势
- 索引因为是快速查询,降低了检索,所以提高io效率
- 通过索引对数据排序,可以降低排序成本,降低CPU消耗
索引的劣势
- 索引也是一张表,保存的主键和索引字段,指向实体表中的记录,索引列是需要空间的,所以一般我们索引不是存放在内存中,而是存放在索引磁盘上
- 索引提高了查询速度,但是降低了增删改的速度,因为每次操作,不仅需要保存数据,还需要保存索引列,增加了数据库的操作
- 索引也仅仅是提高效率的一方面,如果在数据库有大量表,大量字段的时候,需要花时间找出最优的索引列,浪费时间成本
索引结构初步分析
这里对B树进行简单的结构分析
这是一个B树的模型,其中每一块的结构都是一样的,有浅蓝色、深蓝色、黄色三部分组成,
- 浅蓝色:磁盘块
- 深蓝色:数据项
- 黄色:指针
下面针对一个需求进行分析,例如我们需要找29这个数据
- 首先我们会在顶部查找,因为35>29>17,所以进入P2指针块
- 然后继续比较,30>29>26,所以继续进入P2指针块
- 然后就可以查找到我们的数据了
这里可以看到,我们一共就查询了三次,而不是对所有的数据进行遍历,同时我们每次也只是加载我们需要的指针块,而不是对这一层的所有数据进行加载,所以说索引可以很高效的提高我们的效率
什么场景适合创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的应该建立索引
- 查询与其他表关联的字段,外键关系应该建立索引
- 单键/组合索引的选择问题,应该选择组合索引,因为命中率更高,但是索引字段不要太多
- 查询排序的字段,也应该通过索引建立
- 查询中统计或者分组的字段也应该建立索引
什么场景不适合常见索引
- 表记录太少
- 经常增删改的表,因为需要维护索引
- 如果一个表中重复字段太多,就没必要创建索引(ps:不重复字段/总字段,值越接近1,就越有必要创建索引)
- where条件中不用的字段,也不用创建索引