数据库的索引和锁

Posted oxygeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库的索引和锁相关的知识,希望对你有一定的参考价值。

前言

声明:如果没有说明具体的数据库和存储引擎,默认指的是MySQL中的InnoDB存储引擎

【参考资料】:本文摘自数据库两大神器【索引和锁】

索引

在之前,我对索引有以下的认知:

  • 索引可以加快数据库的检索速度
  • 表经常进行INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度。
  • 索引需要占物理和数据空间。
  • 了解过索引的最左匹配原则
  • 知道索引的分类:聚集索引和非聚集索引
  • mysql支持Hash索引和B+树索引两种

看起来好像啥都知道,but,但面试让你说的时候可能就GG了:

  • 使用索引为什么可以加快数据库的检索速度啊?
  • 为什么说索引会降低插入、删除、修改等维护任务的速度?
  • 索引的最左匹配原则指的是什么?
  • Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗?
  • 聚集索引和非聚集索引有什么区别?
  • ........

索引的基础知识

索引的基础知识

 

首先Mysql的基本存储结构是(记录都存在页里边):

技术分享图片

技术分享图片

可以得出以下结论:

1. 各个数据页可以组成一个双向链表

2. 而每个数据页中的记录又可以组成一个单向链表

  • 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录
  • 其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。

所以说,如果我们写select * from user where username = ‘Java3y‘这样没有进行任何优化的sql语句,默认会这样做:

  • 遍历双向链表,定位到所在的页
  • 从所在的页内中查找相应的记录,因为不是根据主键查询,因而只能遍历

很明显,在数据量很大的情况下这样查找会很慢

索引提高检索速度

通过上面可知,加快查找速度势在必行,那么,索引做了些什么可以让我们查询加快速度呢?

其实就是将无序的数据变成有序(相对):

技术分享图片

例如:要找到id为8的记录简要步骤:

技术分享图片

很明显的是:

  • 没有用索引我们是需要遍历双向链表来定位对应的页,现在通过**“目录”**就可以很快地定位到对应的页上了!
  • 其实底层结构就是B+树,B+树作为树的一种实现,能够让我们很快地查找出对应的记录。

【参考资料】:Mysql索引

索引降低增删改的速度

哈希索引

InnoDB支持哈希索引嘛?

聚集和非聚集索引

索引最左匹配原则

=、in自动优化顺序

索引总结

数据库锁知识

表锁

行锁

MVCC和事务的隔离级别

乐观锁和悲观锁

间隙锁GAP

死锁

锁总结

以上是关于数据库的索引和锁的主要内容,如果未能解决你的问题,请参考以下文章

数据库索引聚集/非聚集索引,索引和锁

一步一步带你入门MySQL中的索引和锁 (转)

一步一步带你入门MySQL中的索引和锁

锁-隔离级别的一些补充

通过MySQL存储原理来深度分析排序和锁

数据库-常见面试题汇总