[B站尚硅谷](https://space.bilibili.com/302417610/?spm_id_from=333.999.0.0)
## 1. 什么是索引
官方: 本質是一種數據結構, 是幫助MySQL高效獲取數據的數據結構
是排好序的快速查找數據結構
## 2. 索引的優劣
### 1. 優勢
* 提高數據檢索效率,降低數據庫的IO成本
* 降低數據排序成本,降低了CPU的消耗
### 2. 劣勢
* 實際上索引也是一張表,該表保存了主鍵和索引字段,并指向實體表的記錄,所以索引列也是要占用空間的
* 因為更新表時,MySQL不僅要不存數據,還要保存一下索引文件每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息
* 索引只是提高效率的一個因素,如果你的MySQL有大數據量的表,就需要花時間研究建立優秀的索引,或優化查詢語句
## 3. 索引分類
* 單值索引 即一個索引只包含單個列,一個表可以有多個單列索引
* 唯一索引 索引列的值必須唯一,但允許有空值
* 復合索引 即一個索引包含多個列
## 4. 索引創建的基本語法
### 創建
如果是CHAR,VARCHAR類型,length可以小于字段實際長度;
如果是BLOB和TEXT類型,必須指定length。
```
CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));
```
```
ALTER mytable ADD [UNIQUE] INDEX [indexName] ON(columnname(length));
```
### 刪除
```
DROP INDEX [indexName] ON mytable;
```
### 查看
```
SHOW INDEX FROM table_name G
```
## 5. 哪些情況需要創建索引
1. 主鍵自動建立唯一索引
2. 頻繁作為查詢的條件的字段應該創建索引
3. 查詢中與其他表關聯的字段,外鍵關系建立索引
4. 頻繁更新的字段不適合創建索引 因為每次更新不單單是更新了記錄還會更新索引,加重IO負擔
5. Where條件里用不到的字段不創建索引
6. 單間/組合索引的選擇問題,who?(在高并發下傾向創建組合索引)
7. 查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序的速度
8. 查詢中統計或者分組字段
## 6. 哪些情況不要創建索引
1. 表記錄太少
2. 經常增刪改的表
3. 數據重復且分布平均的表字段,因此應該只為經常查詢和經常排序的數據列建立索引。
注意,如果某個數據列包含許多重復的內容,為它建立索引就沒有太大的實際效果。
## 7. 性能分析
### 7.1 Explain
使用: Explain + SQL語句
結果

作用:
1. 表的讀取順序 id 字段
2. 數據讀取操作的操作類型 select_type
3. 哪些索引可以使用 possible_keys
4. 哪些索引被實際使用 key
5. 表之間的引用 ref
6. 每張表有多少行被優化器查詢 rows
### 7.2 Explain 結果介紹
#### 7.2.1 ID 表的讀取順序 *
select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序
1. id相同,執行順序由上至下

2. id不同,如果是子查詢,id的序號會遞增,id值越大優先級越高,越先被執行

3. id相同不同,同時存在

#### 7.2.2 select_type
數據讀取操作的操作類型
1. SIMPLE 簡單的select查詢,查詢中不包含子查詢或者UNION
2. PRIMARY 查詢中若包含任何復雜的子部分,最外層查詢則被標記為 PRIMARY
3. SUBQUERY 在SELECT或者WHERE列表中包含了子查詢
4. DERIVED 在FROM列表中包含的子查詢被標記為DERIVED(衍生)MySQL會遞歸執行這些子查詢,把結果放在臨時表里。
5. UNION 若第二個SELECT出現在UNION之后,則被標記為UNION;
若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVED
6. UNION RESULT 從UNION表獲取結果的SELECT
7.
#### 7.2.3 table
#### 7.2.4 type

從最好到最差依次是
system > const > eq_ref > ref > range > index > ALL
一般達到range, 最好能達到ref
1. system 表只有一行記錄(等于系統表),這是const類型的特例,平時不會出現,這個也可以忽略不計
2. const 表示通過索引一次就找到了,const用于比較primary key或者unique索引。因為只匹配一行數據,所以很快。如將主鍵至于where列表中,MySQL就能將該查詢轉換為一個常量
3. eq_ref 唯一性索引,對于每個索引鍵,表中只有一條記錄與之匹配,常見于主鍵或唯一索引掃描
4. ref 非唯一索引掃描,返回匹配某個單獨值的所有行。本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬于查找和掃描的混合體
5. range 只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引一般就是在你的where語句中出現了between、<、>、in等的查詢這種范圍掃描索引掃描比全表掃描要好,因為他只需要開始索引的某一點,而結束語另一點,不用掃描全部索引
6. index Full Index Scan,index與ALL區別為index類型只遍歷索引樹。這通常比ALL快,因為索引文件通常比數據文件小。(也就是說雖然all和index都是讀全表,但index是從索引中讀取的,而all是從硬盤中讀的)
7. all FullTable Scan,將遍歷全表以找到匹配的行
#### 7.2.5 possible_keys
顯示可能應用在這張表中的索引,一個或多個。
查詢涉及的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用
#### 7.2.5 key *
實際使用的索引。如果為null則沒有使用索引
查詢中若使用了覆蓋索引,則索引和查詢的select字段重疊
#### 7.2.6 ref
顯示索引那一列被使用了,如果可能的話,是一個常數。那些列或常量被用于查找索引列上的值

#### 7.2.7 rows *
根據表統計信息及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數
#### 7.2.8 Extra
1. Using filesort 說明MySQL 會對數據使用一個外部的索引排序, 而不是按照表內的索引順序進行讀取. MySQL 無法利用索引完成的排序操作稱為 "文件排序"
2. Using temporaty 使用了臨時表保存中間結果, 常見于排序 和分組查詢
3. Using Index 效率高
4. USING JOIN buffer (Block Nested LOOP) 緩存塊嵌套循環鏈接,join連表時使用了BNL算法,如果無法使用Index Nested-Loop Join的時候, 就默認使用這個。可以通過調整join_buffer_size參數來優化BNL算法的性能或者在連表的字段上加索引
5. Using where : 表示 MySQL 正在使用 WHERE 子句中的條件來過濾行,需要掃描表或索引,并應用 WHERE 條件來決定哪些行應該被返回。優化:為 WHERE 子句中經常使用的、選擇性高的列創建索引;對于多個條件的 AND 操作,考慮創建復合索引(多列索引);使用覆蓋索引減少回表;減少返回的字段,去掉非必要字段
## 8. 索引優化
1. 全值匹配我最愛
2. 最佳左前綴法則 如果索引了多例,要遵守最左前綴法則。指的是查詢從索引的最左前列開始并且不跳過索引中的列。帶頭大哥不能死,中間兄弟不能斷
3. 不在索引列上做任何操作(計算、函數、(自動or手動)類型轉換),會導致索引失效而轉向全表掃描
4. 存儲引擎不能使用索引中范圍條件右邊的列
5. 盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select*
6. mysql在使用不等于(!=或者<>)的時候無法使用索引會導致全表掃描
7. is null,is not null 也無法使用索引
8. like以通配符開頭('$abc...')mysql索引失效會變成全表掃描操作
9. 字符串不加單引號索引失效
10. 少用or,用它連接時會索引失效
## 9. 查詢優化
### 9.1 永遠小表驅動大表, 類似嵌套循環Nested Loop


### 9.2 order by關鍵字優化
聯合索引的各個排序列的排序順序必須要一致
ORDER BY子句,盡量使用Index方式排序,避免使用FileSort方式排序
使用Index排序的兩種情況
order by 語句使用索引最左前列
使用where子句與order by字句條件列組合滿足索引最左前列

### 9.3 group by關鍵字優化
和order by 相似
## 10 slow_query_log 慢查詢日志
默認是關閉的
開啟: set global slow_query_log = 1 本次有效, 重啟數據庫就沒用了, 長期開啟要設置配置文件
Mysql 日志工具

## 11 Mysql鎖機制
### 11.1 鎖的分類
從數據操作的類型(讀、寫)分
讀鎖(共享鎖):針對同一份數據,多個讀操作可以同時進行而不會互相影響, 此時無法修改數據
寫鎖(排它鎖):當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖。
從對數據操作的顆粒度
表鎖
行鎖
頁鎖(前倆鎖之前, 了解即可)
### 11.2 表鎖(偏讀)
偏向MyISAM存儲引擎,開銷小,加鎖快,無死鎖,鎖定粒度大,發生鎖沖突的概率最高,并發最低

### 11.3 行鎖(偏寫)
偏向InnoDB存儲引擎,開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高。
InnoDB與MyISAM的最大不同有兩點:一是支持事務(TRANSACTION);二是采用了行級鎖
#### 間隙鎖危害

## 如何鎖定一行

- 學習地址
- MySQL
- 查詢優化
- SQL優化
- 關于or、in、not in、!=等走不走索引的說明
- 千萬級數據查詢優化
- MySQL 深度分頁問題
- 嵌套循環 Block Nested Loop 導致索引查詢慢
- MySQL增加日志統計表優化各種日志表的統計功能
- MySQL單機讀寫QPS(性能)優化
- sqlMode 置 select 的值可以比 group 里的多
- drop、delete、truncate的區別
- 尚硅谷MySQL數據庫高級學習筆記
- MySQL架構
- 事務部分
- MySQL知識點
- mysql索引
- Linux docker安裝 mysql 8.0.25
- docker 安裝mysql 5.7
- mysql Field ‘xxx’ doesn’t have a default value
- mysql多實例
- docker中的sql文件導入
- mysql進階知識
- mysql字符集
- 連接的原理
- redo日志
- InnoDB存儲引擎
- InnoDB的數據存儲結構
- B+樹索引
- 文件系統-表空間
- Buffer Pool
- 億級數據導入到es
- MySQL數據復制
- MySQL缺少主鍵的表數據
- mysql update 其中更新的字段根據另一個更新字段作為條件去更新
- MySQL指定字段值排序(將指定值排在前面)
- 設置MySQL連接數、時區
- Navicat15右鍵刪除數據刷新就又恢復了
- MySQL替換字段部分內容
- Java和MySQL統計本周本月本季和年
- 分頁時order by 排序數據重復,丟失
- mysql同一張表根據某個字段刪除重復數據
- mysqldump定時全量熱備
- 專題總結
- 事務
- MySQL事務
- spring事務
- spring事務本類調用
- spring事務傳播行為
- spring事務失效問題
- 鎖和Transactional注解一塊使用的問題
- 數據安全
- 敏感數據
- SQL注入
- 數據源
- XSS
- 接口設計
- 緩存設計
- 限流
- 自定義注解實現根據用戶做QPS限流
- 架構
- 高可用
- Java
- Unsatisfied dependency expressed through field ‘baseMapper‘
- mybatisplus多數據源
- 單個字母前綴的java變量
- spring
- spring循環依賴解決
- 事務@Transactional
- yml 文件配置信息綁定到java工具類的靜態變量上
- @Configuration @Component 區別
- springboot啟動yml文件報錯
- spring方法重試注解Retryable
- spring讀取yml集合數據
- spring自定義注解
- 獲取resource下的圖片資源
- 手機號和電話號的正則驗證
- 獲取字符串中的數字
- mybatis
- mybatis多參數添加數據并返回主鍵
- 統一異常處理
- 分組校驗
- Java讀取Python json.dumps 函數保存的redis數據
- springboot整合springCache
- 若依mybatis值為null的字段沒有返回
- 若依
- 接口白名單
- @JsonFormat時區問題
- RequestParam.value() was empty on parameter 0
- jdk8和hutool請求第三方的https報錯
- springMVC
- springMVC與vue使用post傳數組
- elementUI 時間組件報錯問題
- vue具名插槽slot
- springboot配置maven的profiles(配置微服務多環境切換打包)
- resources 配置文件讀取順序
- Windows的cmd部署jar注意事項
- Java基礎
- JUC(鎖-并發-線程池)
- CAS
- Java 鎖簡介
- synchronized和Logk有什么區別?用新的ock有什么好處
- synchronized鎖介紹
- CompletableFuture
- 多線程
- 線程池
- 集合類
- map見過的小問題
- 退出雙層循環
- StringBuilder和StringBuffer核心區別
- 日志打印
- 打印log日志
- log日志文件生成配置
- 日期時間
- 時間戳轉為時間
- 并發工具
- 連接池
- http調用
- 內網訪問天地圖
- 判等問題
- 數值計算
- null問題
- 異常處理
- 文件IO
- 序列化
- 內存溢出OOM
- Double轉String出現E的問題
- springboot接收前端表單提交多字段和上傳文件
- 子線程的錯誤, 全局異常處理捕獲不到
- vue同一個項目訪問多個不同ip地址接口
- Autowired注解導入為null
- shiro
- UnavailableSecurityManagerException錯誤
- Windows服務器80端口被占用
- java圖片增加水印
- springcloud
- Feign方法配置錯誤導致jar包啟動失敗
- feign調用超時
- Springcloud從Nacos的yml文件讀取出錯
- 定時任務quartz
- JavaPOI導出Excel
- 合并行和列
- 設置樣式
- 設置背景色
- docker
- Linux 安裝
- docker命令
- docker網絡
- docker數據卷
- dockerfile
- docker安裝ping命令
- docker-compose
- docker-compose文件內容介紹
- Linux關閉docker開機啟動
- jar打包為鏡像
- 遷移docker容器存儲位置
- Nginx
- Linux在線安裝Nginx
- nginx.conf 核心配置文件
- vue 和 nginx 刷新頁面會報404
- nginx 轉發給三個集群的tomcat
- ServerName匹配規則
- Nginx負載均衡策略
- location 匹配規則
- Nginx 搭建前端調用后臺接口的集群
- alias與root
- nginx 攔截 post 請求, 帶參數轉發到前端頁面
- 防盜鏈配置
- Nginx的緩存
- 通用Nginx配置
- nginx配置文件服務器
- 后臺jar包得不到正確ip,nginx代理時要處理
- 升級使用websocket協議
- 設置IP黑/白名單
- vue項目get請求Nginx返回html頁面post返回405錯誤
- Nginx限制所有接口流量
- Redis
- 緩存數據一致性
- 內存淘汰策略
- Redis數據類型
- gmt6
- Linux安裝GMT6
- GMT6配置中文
- GMT文件修改Windows版本到Linux版本
- 注意GMT不同字體導致符號不同的問題
- GMT繪制南海諸島小圖
- GMT生成中文圖例
- elasticsearch
- 安裝配置
- Linux安裝配置elasticsearch7.6.2
- Linux 安裝 kibana 7.6.2
- 安裝7.6.2中文分詞器
- docker 安裝elasticsearch7.6.2
- 安裝Logback7.6.2
- springboot使用
- 0. elasticsearch賬號密碼模式訪問
- 1. 配置連接
- 2. 索引
- 3. 批量保存更新
- Result window is too large 10000
- elasticsearch 分詞的字段做排序 fielddata, 設置fielddata=true 無效果
- elasticsearch 完全匹配查詢(精確查詢)
- 模糊搜索
- 日期區間查詢
- 6.x基礎知識
- 自定義詞庫
- elasticsearch集群
- 搜索推薦Suggester
- 查詢es保存的數組
- 億級mysql數據導入到es
- es 報錯 ORBIDDEN/12/index read-only
- es核心概念
- es的分布式架構原理
- 優化大數據量時的ES查詢性能
- canal
- 1. mysql的Binlog
- 2. Canal 的工作原理
- 3. canal同步es
- JVM
- 1 類的字節碼
- 2. 類的加載
- JVM知識點
- Maven
- 依賴沖突
- xxl-job
- docker 安裝配置 xxl-job
- idea
- springboot啟動報錯命令過長
- services統一啟動微服務各模塊
- 云服務器安裝寶塔面板
- 突然出現啟動或者運行特別慢
- 有導入依賴但是顯示紅色同時點擊進去也有依賴
- Linux
- sh文件執行報錯: command not found
- 使用vagrant安裝虛擬機
- Linux 開啟端口
- 開放端口
- 復制文件夾及其文件到另一個文件夾
- 兩個服務器之間映射端口
- TCP協議
- 分層模型
- TCP概述
- 支撐 TCP 協議的基石 —— 首部字段
- 數據包大小對網絡的影響 —— MTU 與 MSS 的奧秘
- 端口號
- 三次握手
- TCP 自連接
- 四次揮手
- TCP 頭部時間戳
- 分布式
- 分布式腦裂問題
- 分布式事務
- 基礎知識
- 實現分布式事務的方案
- 阿里分布式事務中間件seata
- 冪等性問題
- 其他工具
- webstorm git提交代碼后project目錄樹不顯示
- 消息隊列
- 如何保證消費的順序
- 數據結構
- 漫畫算法:小灰的算法之旅
- oracle