企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] > ### 索引 * [B树](https://mp.weixin.qq.com/s/rDCEFzoKHIjyHfI_bsz5Rw) * [B+树索引](https://mp.weixin.qq.com/s/jRZMMONW3QP43dsDKIV9VQ) * B-Tree通常意味着所有的值都是按照顺序存储的,并且每一个叶子页到根的距离相同。B-Tree索引适用于全键值、键值范围或者键前缀查找。 * B+树相比B-,所有数据存储在叶子节点,中间节点只是做索引,叶子节点形成一个链表,范围查找更快 * hash索引,把键值换算成新的哈希值,根据这个哈希值来定位。 * 单条记录查询的时候,选择哈希索引,查询性能最快 * 哈希索引只支持等值比较查询,包括=、IN()、<=>(注意<>和<=>是不同的操作)。也不支持任何范围查询,例如WHERE price > 100 * 哈希索引只适用于某些特定场合 * 不支持最左匹配 * 不支持范围查找 * 大量重复键值情况下,哈希效率低(哈希碰撞) <br/> > ### [MySQL表锁和行锁机制](https://cloud.tencent.com/developer/article/1165662) * 行锁/表锁 * InnoDB默认采用行锁,使用索引作为检索条件修改数据时采用行锁,否则采用表锁。 * InnoDB 自动给修改操作加锁,给查询操作不自动加锁 * 行锁相对于表锁来说,优势在于高并发场景下表现更突出,毕竟锁的粒度小。 * 当表的大部分数据需要被修改,或者是多表复杂关联查询时,建议使用表锁优于行锁。 <br/> > ### [死锁问题分析](https://yq.aliyun.com/articles/5533?&utm_source=qq) <br/> > ### 事务隔离级别 * 数据库事务特征,即 ACID * A Atomicity 原子性 * C Consistent 一致性 * I Isolation 隔离性 * D Durable 持久性 * 脏读、不可重复读、幻读的概念 * **丢失更新** * **脏读**,指一个事务中访问到了另外一个事务未提交的数据 * **不可重复读**,一个事务中两次读取同一条记录,得到的结果不一致 * **幻读**,一个事务中读取2次,得到的记录条数不一致 * 幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。 * **丢失更新** * **READ_UNCOMMITTED(未授权读取)**: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。 * **READ_COMMITTED(授权读取)**: Oracle 默认采用该级别,允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。 * **REPEATABLE_READ(可重复读)**: Mysql默认采用该级别,该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录值都相同。即使在多次查询之间有数据修改了,这些被修改的记录也会被忽略。该级别可以防止脏读和不可重复读。 * **SERIALIZABLE(串行)**: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 <br/> > ### 事物隔离级别的实现 * 通过对锁的类型(读锁还是写锁),锁的粒度(行锁还是表锁),持有锁的时间(临时锁还是持续锁)合理的进行组合,实现四种不同的隔离级别。 * **读未提交(Read Uncommitted)**:事务读不阻塞其他事务读和写,事务写阻塞其他事务写但不阻塞读;通过对写操作加 “持续X锁”,对读操作不加锁 实现; * **读已提交(Read Committed)**:事务读不会阻塞其他事务读和写,事务写会阻塞其他事务读和写;通过对写操作加 “持续X锁”,对读操作加 “临时S锁” 实现;不会出现脏读; * **可重复读(Repeatable Read)**:事务读会阻塞其他事务事务写但不阻塞读,事务写会阻塞其他事务读和写;通过对写操作加 “持续X锁”,对读操作加 “持续S锁” 实现; * **序列化(Serializable)**:为了解决幻读问题,行级锁做不到,需使用表级锁。 <br/> > ### `MVCC` * `Multi-Version Concurrent Control`(多版本并发控制),`InnoDb` 会为每一行记录增加几个隐含的“辅助字段”,(实际上是 3 个字段:一个隐式的 ID 字段,一个事务 ID,还有一个回滚指针),事务在写一条记录时会将其拷贝一份生成这条记录的一个原始拷贝,写操作同样还是会对原记录加锁,但是读操作会读取未加锁的新记录,这就保证了读写并行。 <br/> *** 参考: [索引和锁](https://juejin.im/post/5b55b842f265da0f9e589e79) [MySQL 表锁和行锁机制](https://cloud.tencent.com/developer/article/1165662) [mysql死锁问题分析](https://yq.aliyun.com/articles/5533?&utm_source=qq) [漫画:什么是B+树?](https://mp.weixin.qq.com/s/jRZMMONW3QP43dsDKIV9VQ) [解决死锁之路 ](https://www.aneasystone.com/archives/2017/10/solving-dead-locks-one.html) [read committed && MVCC](http://www.imooc.com/article/17290)