MySQL学习笔记-从基础到进阶
MySQL自學筆記
- MySQL
- 基礎
- SQL
- SQL通用語法
- SQL分類
- DDL數(shù)據(jù)操作
- 數(shù)據(jù)類型
- DML數(shù)據(jù)操作
- DQL數(shù)據(jù)操作
- DCL數(shù)據(jù)控制
- 函數(shù)
- 約束
- 多表查詢
- 事務
- 進階
- 存儲引擎
- **索引**(重點)
- SQL優(yōu)化
- 視圖
- 存儲過程
- 鎖
- InnoDB引擎
- 邏輯存儲結(jié)構(gòu)
- 架構(gòu)
- 內(nèi)存架構(gòu)
- 磁盤架構(gòu)
- 后臺線程
- 事務原理
- MVCC
MySQL
課程連接
數(shù)據(jù)庫:存儲數(shù)據(jù)的倉庫,數(shù)據(jù)是有組織的進行存儲(DataBase, DB)
數(shù)據(jù)庫管理系統(tǒng):操縱和管理數(shù)據(jù)庫的大型軟件(DataBase Management System, DBMS)
SQL : 操作關(guān)系型數(shù)據(jù)庫的編程語言,定義了一套操作關(guān)系型數(shù)據(jù)庫的統(tǒng)一標準(Structured Query Language, SQL)
基礎
-
關(guān)系型數(shù)據(jù)庫(RDBMS)
- 概念:建立在關(guān)系模型基礎上,有多張相互連接的二維表組成的數(shù)據(jù)庫
- 使用表存儲數(shù)據(jù),格式統(tǒng)一,便于維護
- 使用SQL語言操作,標準統(tǒng)一,使用方便
-
MySQL啟動
- MySQL數(shù)據(jù)模型
- 數(shù)據(jù)庫管理系統(tǒng) --> 數(shù)據(jù)庫 --> 二維表
SQL
SQL通用語法
- SQL語句可以單行或多行書寫,以分號結(jié)尾
- SQL語句可以使用空格/縮進來增強語句的可讀性
- MySQL數(shù)據(jù)庫的SQL語句不區(qū)分大小寫,關(guān)鍵字建議使用大寫
- 注釋
- 單行注釋:–或#
- 多行注釋:/* */
SQL分類
- DDL (Data Definition Language) 數(shù)據(jù)定義語言,用來定義數(shù)據(jù)庫對象(數(shù)據(jù)庫、表、字段等)
- DML(Data Manipulation Language) 數(shù)據(jù)操作語言,用來對數(shù)據(jù)庫表中的數(shù)據(jù)進行增刪改查
- DQL(Data Query Language) 數(shù)據(jù)查詢語言,用來查詢數(shù)據(jù)庫中標的記錄
- DCL(Data Control Language) 數(shù)據(jù)控制語言,用來創(chuàng)建數(shù)據(jù)庫用戶、控制數(shù)據(jù)庫的訪問權(quán)限
DDL數(shù)據(jù)操作
- 查詢
- 創(chuàng)建
- 刪除
- 使用
- 表操作-查詢
- 表操作-創(chuàng)建
- 表操作-修改
數(shù)據(jù)類型
- 數(shù)據(jù)類型-數(shù)值類型
- 數(shù)值類型-字符類型
- 數(shù)值類型-日期類型
DML數(shù)據(jù)操作
- INSERT添加數(shù)據(jù)
- UPDATE修改數(shù)據(jù)
DQL數(shù)據(jù)操作
- 基本查詢
- 條件查詢
- 聚合函數(shù)
- 分組查詢
- 排序查詢
- 分頁查詢
- 執(zhí)行順序
DCL數(shù)據(jù)控制
- 用戶管理
- 權(quán)限控制
函數(shù)
- 字符串函數(shù)
- 數(shù)值函數(shù)
- 日期函數(shù)
- 流程函數(shù)
約束
-
概念:約束是作用于表中字段上的規(guī)則,用于限制存儲在表中的數(shù)據(jù)
-
目的:保證數(shù)據(jù)庫中數(shù)據(jù)的正確、有效性和完整性
-
分類:
-
注意:約束是作用于表中字段上,可以在創(chuàng)建表/修改表時添加約束
-
外鍵約束:外鍵用來讓兩張表的數(shù)據(jù)之間建立連接,從而保證數(shù)據(jù)的一致性和完整性
- 外鍵約束刪除/更新行為
多表查詢
- 多表關(guān)系
- 多表查詢
事務
-
事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有操作作為一個整體一起向系統(tǒng)提交或撤銷操作請求,這些操作要么同時成功,要么同時失敗
-
默認MySQL的事務是自動提交的
-
事務操作
- 事務四大特性
- 并發(fā)事務問題
- 并發(fā)事務隔離級別
進階
存儲引擎
- MySQL體系結(jié)構(gòu)
- 存儲引擎
- 存儲引擎特點
- 存儲引擎選擇
索引(重點)
-
索引(index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(有序)。在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實現(xiàn)高級查找算法,這種數(shù)據(jù)結(jié)構(gòu)就是索引。
-
優(yōu)缺點
- 索引結(jié)構(gòu)
MySQL的索引是在存儲引擎層實現(xiàn)的,不同的存儲引擎有不同的結(jié)構(gòu),主要包含一下幾種:
- B-Tree(多路平衡查找樹)
二叉樹缺點:順序插入時,會形成一個鏈表,查詢性能大大降低。大數(shù)據(jù)量情況下,層級較深,檢索速度慢
紅黑樹:大數(shù)據(jù)量情況下,層級較深,檢索速度慢
B-Tree:以一顆最大度數(shù)(max-degree)為5階的B-Tree為例(每個節(jié)點最多存儲4個key,5個指針),樹的度數(shù)指的是一個節(jié)點的子節(jié)點個數(shù)
- B+Tree
? 與B-Tree區(qū)別:所有的數(shù)據(jù)都會出現(xiàn)在葉子節(jié)點;葉子節(jié)點形成一個單向列表。
-
MySQL索引數(shù)據(jù)結(jié)構(gòu)對經(jīng)典B+Tree進行了優(yōu)化,在原B+Tree的基礎上,增加一個指向相鄰葉子節(jié)點的鏈表指針,就形成了帶有順序指針的B+Tree,提高區(qū)間訪問的性能
-
Hash索引
哈希索引就是采用一定的hash算法,將鍵值換算成新的hash值,映射到對應的槽位上,然后存儲在hash 表中。如果兩個(或多個)鍵值,映射到一個相同的槽位上,他們就產(chǎn)生了hash沖突(hash碰撞),可以通過鏈表解決。
特點:hash索引只能用于對等比較(=、in),不支持范圍查詢(between、> 、< ...)無法利用索引完成排序操作;查詢效率高,通常只需要一次檢索就可以了,效率通常高于B+Tree索引? 在MySQL中,支持hash索引的值Memory引擎,而innoDB中具有自適應hash功能,hash索引是存儲引擎根據(jù)B+Tree索引在指定條件下自動構(gòu)建的。
-
為什么InnoDB存儲引擎選擇使用B+Tree索引結(jié)構(gòu)?
1、相對于二叉樹,層級更少,搜索效率高
2、對于B-Tree,無論是葉子節(jié)點還是非葉子節(jié)點,都會保存數(shù)據(jù),這樣導致一頁存儲的鍵值減小,指針跟著減小,同樣保存大量的數(shù)據(jù),只能增加樹的高度,導致性能降低
3、相對于Hash索引,B+Tree支持范圍匹配和排序操作
-
索引分類
在InnoDB引擎中,根據(jù)索引的存儲形式,又可以分為一下兩種:
-
聚集索引選取規(guī)則
1、如果存在主鍵,主鍵索引就是聚集索引
2、如果不存在主鍵,將使用第一個唯一索引作為主鍵索引
3、如果表沒有之間,或沒有合適的唯一索引,則引擎會自動生成一個rowid作為隱藏的聚集索引
- 索引語法
- SQL性能分析
-
索引使用
- 最左前綴法則:如果索引了多列(聯(lián)合索引),要遵循最左前綴法則。其指的是查詢從索引的最左列開始,并且不跳過索引中的列,與索引時字段的位置沒有關(guān)系。如果跳過某一列,索引將部分失效(后面的字段索引失效),這個與創(chuàng)建索引時的順序有關(guān)。
- 范圍查詢:聯(lián)合索引中,出現(xiàn)范圍查詢(>,<),范圍查詢右側(cè)的列索引失效。盡量使用(>=,<=)。
- 索引列運算:不要在索引列上進行運算操作,索引將失效。
- 字符串不加引號:字符串類型字段使用索引時,如果不加引號,索引將失效。
- 模糊查詢:如果僅僅是尾部模糊匹配(like ‘xx%’),索引不會失效。如果頭部模糊匹配(like ‘%xx’),索引失效。
- or 連接條件:用or分割開的條件,如果or前的條件中的列有索引,而后面的列中沒有索引,那么涉及的索引都會失效。即使左側(cè)有索引,右側(cè)有聯(lián)合索引,右側(cè)相當于沒有索引,依然or兩側(cè)索引失效。
- 數(shù)據(jù)分布影響:如果MySQL評估使用索引比全表掃描更慢,則不使用索引。
-
SQL提示
- 覆蓋索引
- 前綴索引
- 單列索引與聯(lián)合索引
- 索引設計原則
SQL優(yōu)化
- insert優(yōu)化
- 主鍵優(yōu)化
- order by
- group by優(yōu)化
- limit優(yōu)化
- count優(yōu)化
- update優(yōu)化
視圖
-
定義:視圖(View)是一種虛擬存在的表。視圖中的數(shù)據(jù)并不在數(shù)據(jù)庫中實際存在,行和列數(shù)據(jù)來自定義視圖的查詢中使用的表,并且是在使用視圖時動態(tài)生成的。
-
語法
- 視圖檢查選項
- 視圖的更新
存儲過程
-
定義
存儲過程是事先經(jīng)過編譯并存儲在數(shù)據(jù)庫中的一段SQL語句的集合,調(diào)用存儲過程可以簡化應用開發(fā)人員的很多工作,減少數(shù)據(jù)在數(shù)據(jù)庫和應用服務器之間的傳輸,對于提高數(shù)據(jù)處理的效率是有利的。
存儲過程思想就是數(shù)據(jù)庫SQL語言層面的代碼封裝與重用
-
特點
1、封裝、復用
2、可以接受參數(shù),也可以返回數(shù)據(jù)
3、減少網(wǎng)絡交互,提升效率
-
語法
- 變量
- 參數(shù)
- 流程控制
- 游標
- 條件處理程序
- 存儲函數(shù)
- 觸發(fā)器
鎖
鎖是計算機協(xié)調(diào)多個進程或線程并發(fā)訪問某一資源的資質(zhì)。
- 全局鎖
- 表級鎖
- 行級鎖
InnoDB引擎
邏輯存儲結(jié)構(gòu)
- 表空間(ibd文件),一個MySQL實例可以對應多個表空間,用于存儲記錄、索引等數(shù)據(jù)。
- 段,分數(shù)據(jù)段(leaf node segment)、索引段(non-leaf node segment)、回滾段(rollback segment)、InnoDB是索引組織表,數(shù)據(jù)段就是B+樹的葉子節(jié)點,索引段即為B+樹的非葉子節(jié)點。段用來管理多個區(qū)。
- 區(qū),表空間的單元結(jié)構(gòu),每個區(qū)的大小為1M。默認情況下,存儲引擎頁大小為16K,一個區(qū)中有64個連續(xù)的頁。
- 頁,存儲引擎磁盤管理的最小單元,每個頁的大小默認為16K。為保證頁的連續(xù)性,存儲引擎每次從磁盤申請4-5個區(qū)。
- 行,存儲引擎數(shù)據(jù)是按行進行存放的。
架構(gòu)
內(nèi)存架構(gòu)
-
Buffer Pool :緩沖池是主內(nèi)存中的一個區(qū)域,里面可以緩存磁盤上經(jīng)常操作的真實數(shù)據(jù),在執(zhí)行增刪改查操作時,先操作緩沖池中的數(shù)據(jù)(若沒有數(shù)據(jù),從磁盤加載并緩存),然后再以一定頻率刷新到磁盤,從而減少磁盤iIO,加快處理速度。
緩沖池以頁為單位,底層采用鏈表數(shù)據(jù)結(jié)構(gòu)管理頁。根據(jù)狀態(tài)頁分為三種類型:
- free page: 空閑頁,未被使用
- liean page: 被使用的頁,數(shù)據(jù)沒有被修改過
- dirty page: 臟頁,被使用,數(shù)據(jù)被修改過,頁中數(shù)據(jù)與磁盤的數(shù)據(jù)產(chǎn)生不一致
-
Change Buffer :更改緩沖區(qū)(針對非唯一二級索引頁),在執(zhí)行DML語句時,如果這些數(shù)據(jù)頁沒有在緩沖池中,不會直接操作磁盤,而會將數(shù)據(jù)變更存在更改緩沖區(qū)中,在未來數(shù)據(jù)被讀取時,再將數(shù)據(jù)合并恢復到緩沖池中,最后將合并后的數(shù)據(jù)刷新到磁盤中。
-
緩沖區(qū)的意義
與聚集索引不同,二級索引通常時非唯一的,并且以相對隨機的順序插入二級索引。同樣,刪除和更新可能會影響索引樹種不相鄰的二級索引頁,如果每一次操作磁盤,會造成大量的磁盤IO。有個緩沖區(qū)之后,可以在緩沖池合并處理,減少磁盤IO。
-
-
Adaptive Hash Index :自適應哈希索引,用于優(yōu)化對緩沖池數(shù)據(jù)的查詢。存儲引擎會監(jiān)控表上各索引頁的查詢,如果觀察到哈希索引可以提升速度,則建立哈希索引。無需干涉,系統(tǒng)根據(jù)情況自動建立
參數(shù): adaptive_hash_index – 查看是否開啟
-
Log Buffer :日志緩沖區(qū),用來保存要寫入磁盤中的日志數(shù)據(jù)(redo log、undo log),默認大小為16MB,日志緩沖區(qū)的日志會定期刷新到磁盤。如果需要更新、插入或刪除許多行的事務,增加日志緩沖區(qū)的大小可以節(jié)省磁盤IO。
磁盤架構(gòu)
- System Tablespace :系統(tǒng)表空間時更改緩沖區(qū)的存儲區(qū)域。如果表是在系統(tǒng)表空間而不是每個表文件或通用表空間中創(chuàng)建的,它也可能包含表和索引數(shù)據(jù)。
- File-Per-Table Tablespace :每個表的文件表空間包含單個存儲引擎表的數(shù)據(jù)和索引,并存儲在文件系統(tǒng)上的單個數(shù)據(jù)文件中。
- General Tablespace :通用表空間,需要通過用戶自己創(chuàng)建,在創(chuàng)建表時,可以指定該表空間。
-
Undo Tablespace :撤銷表空間,MySQL實例在初始化時會自動創(chuàng)建兩個默認的undo表空間,初始大小16M,用于存儲undo log 日志。
-
Temporaty Tablespace :存儲引擎會話臨時表空間和全局臨時表空間,存儲用戶創(chuàng)建的臨時表等數(shù)據(jù)。
-
Doublewrite Buffer Files :雙寫緩沖區(qū),存儲引擎將數(shù)據(jù)頁從Buffer Pool刷新到磁盤前,先將數(shù)據(jù)頁寫入雙寫緩沖區(qū)文件中,便于系統(tǒng)異常恢復數(shù)據(jù)。 xxx.dblwr文件
-
Redo Log :重做日志,是用來實現(xiàn)事務的持久性。該日志文件由兩部分組成:重做日志緩沖以及重做日志文件,前者是在內(nèi)存中,后者在磁盤中。當事務提交之后會把所有修改信息都會存放到該日志中,用于在刷新臟頁到磁盤,發(fā)生錯誤時,進行數(shù)據(jù)恢復。
后臺線程
-
Master Thread :核心后臺線程,負責調(diào)度其他線程,還負責將緩沖池中的數(shù)據(jù)異步刷新到磁盤中,保持數(shù)據(jù)一致性,還包括臟頁的刷新、合并插入緩存、undo頁回收。
-
IO Thread :存儲引擎中使用了大量AIO來處理IO請求,極大化提高數(shù)據(jù)庫性能,該線程主要負責IO請求的回調(diào)。
-
Purge Thread :主要用于回收事務已經(jīng)提交的undo log,在事務提交之后,undo log可能不用了,就用該線程回收。
-
Page Cleaner Thread:協(xié)助核心后臺線程刷新臟頁到磁盤的線程,它可以減輕Master Thread的工作壓力,減少阻塞。
事務原理
- redo log 和undo log
MVCC
- 當前讀
讀取的時記錄的最新版本,讀取時還要保證其他并發(fā)事務不能修改當前記錄,會對讀取的記錄進行加鎖。如:
select...lock in share mode(共享鎖)、select...for update、update、insert、delete(排他鎖)都是一種當前讀。- 快照讀
簡單的select(不加鎖)就是快照讀,讀取的時記錄數(shù)據(jù)的可見版本,有可能是歷史數(shù)據(jù),不加鎖,是非阻塞讀。
Read Committed : 每次select,都生成一個快照讀。 Repeatable Read : 開啟事務后第一個select語句才是快照讀的地方。 Serializable : 快照讀會退化為當前讀- MVCC
全稱Multi-Version Concurrency Control,多版本并發(fā)控制。指維護一個數(shù)據(jù)的多個版本,使得讀寫操作沒有沖突,快照讀為MySQL實現(xiàn)MVCC提供了一個非阻塞讀功能。MVCC的具體實現(xiàn),還需要依賴與數(shù)據(jù)庫記錄的三個隱式字段、undo log、readView。
- 隱藏字段
- undo log
- readView
總結(jié)
以上是生活随笔為你收集整理的MySQL学习笔记-从基础到进阶的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 屏幕增强字段如何保存修改记录
- 下一篇: 从0学开发笔记-数据库基础