[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)
- asD
- Java
- Java基礎
- Java編譯器
- 反射
- collection
- IO
- JDK
- HashMap
- ConcurrentHashMap
- LinkedHashMap
- TreeMap
- 阻塞隊列
- java語法
- String.format()
- JVM
- JVM內存、對象、類
- JVM GC
- JVM監控
- 多線程
- 基礎概念
- volatile
- synchronized
- wait_notify
- join
- lock
- ThreadLocal
- AQS
- 線程池
- Spring
- IOC
- 特性介紹
- getBean()
- creatBean()
- createBeanInstance()
- populateBean()
- AOP
- 基本概念
- Spring處理請求的過程
- 注解
- 微服務
- 服務注冊與發現
- etcd
- zk
- 大數據
- Java_spark
- 基礎知識
- Thrift
- hdfs
- 計算機網絡
- OSI七層模型
- HTTP
- SSL
- 數據庫
- Redis
- mysql
- mybatis
- sql
- 容器
- docker
- k8s
- nginx
- tomcat
- 數據結構/算法
- 排序算法
- 快排
- 插入排序
- 歸并排序
- 堆排序
- 計算時間復雜度
- leetcode
- LRU緩存
- B/B+ 樹
- 跳躍表
- 設計模式
- 單例模式
- 裝飾者模式
- 工廠模式
- 運維
- git
- 前端
- thymeleaf
- 其他
- 代碼規范
- work_project
- Interview