前言
只有光头才能变强
索引和锁在数据库中可以说是非常重要的知识点了,在面试中也会经常会被问到的。
本文力求简单讲清每个知识点,希望大家看完能有所收获
声明:如果没有说明具体的数据库和存储引擎,默认指的是MySQL中的InnoDB存储引擎
一、索引
在之前,我对索引有以下的认知:
- 索引可以加快数据库的检索速度
- 表经常进行
INSERT/UPDATE/DELETE
操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度。 - 索引需要占物理和数据空间。
- 了解过索引的最左匹配原则
- 知道索引的分类:聚集索引和非聚集索引
- Mysql支持Hash索引和B+树索引两种
看起来好像啥都知道,但面试让你说的时候可能就GG了:
- 使用索引为什么可以加快数据库的检索速度啊?
- 为什么说索引会降低插入、删除、修改等维护任务的速度。
- 索引的最左匹配原则指的是什么?
- Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗?
- 聚集索引和非聚集索引有什么区别?
- ........
1.1聊聊索引的基础知识
首先Mysql的基本存储结构是页(记录都存在页里边):
- 各个数据页可以组成一个双向链表
-
而每个数据页中的记录又可以组成一个单向链表
- 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录
- 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。
所以说,如果我们写select * from user where username = 'Java3y'
这样没有进行任何优化的sql语句,默认会这样做: