聲明:本文內(nèi)容純屬博主自己查找和歸納的個人所需的知識點,僅作參考,如有錯誤,博主強(qiáng)烈希望您指出。如果您是某個知識點的原創(chuàng)博主,如有需要,可聯(lián)系本人加上鏈接。本文內(nèi)容會根據(jù)博主所需進(jìn)行更新,希望大家多多關(guān)照。
MySQL底層數(shù)據(jù)結(jié)構(gòu)
???????B+樹
存儲引擎之二:InnoDB與Myisam
| ? | InnoDB | Myisam |
|---|---|---|
| 事務(wù) | 支持 | 不支持 |
| 外鍵 | 支持 | 不支持 |
| 鎖 | 表鎖、行鎖 | 表鎖 |
| 總行數(shù) | 需要掃描整個表 | 直接讀取 |
| 文件 | .idb數(shù)據(jù)文件和它的.frm文件,表的大小只受限于操作系統(tǒng)文件的大小,一般為 2GB | .frm文件存儲表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。索引文件的擴(kuò)展名是.MYI (MYIndex)。 |
| 使用環(huán)境 | 都符合要求的情況下,改動多的時候 | 都符合要求的情況下,查找多的時候 |
| 自增長 | 必須為索引,計數(shù)器存在內(nèi)存,8.0版本后寫入到redo log中 | 沒有限制,還能建立聯(lián)合索引 |
范式
?范式背景:
?1.解決數(shù)據(jù)冗余
?2.數(shù)據(jù)的優(yōu)化與存儲
?3.保存數(shù)據(jù)之后,可以通過關(guān)系得到的數(shù)據(jù),不再存儲
第一范式:字段能直接拿來用,不需要分割或者其他操作,即原子性
第二范式:第二范式就是在滿足第一范式的前提下,解決部分依賴的問題,比如某些字段只依賴復(fù)合主鍵的其中一個,解決的方法是使用邏輯主鍵等,使這些字段直接或者間接依賴主鍵,但是會出現(xiàn)傳遞依賴的問題
第三范式:第三范式就是在滿足第二范式的前提下,解決傳遞依賴的問題,也就是間接依賴主鍵,解決的方法是將存在傳遞依賴的字段以及依賴的字段本身單獨取出,形成一個單獨的表,然后在需要對應(yīng)信息的時候,使用對應(yīng)的實體表的主鍵加進(jìn)來
連接
內(nèi)連接:獲取兩個表相同字段都有的數(shù)據(jù)
SELECT a.xxx, b.xxx FROM table1 a INNER JOIN table2 b ON a.xxx = b.xxx;
等價于
SELECT a.xxx, b.xxx FROM table1 a, table2 b WHERE a.xxx = b.xxx;左連接:獲取左表指定的數(shù)據(jù),即使右表沒有
SELECT a.xxx, b.xxx FROM table1 a LEFT JOIN table2 b ON a.xxx = b.xxx;右連接:獲取右表指定的數(shù)據(jù),即使左表沒有
SELECT a.xxx, b.xxx FROM table1 a RIGHT JOIN table2 b ON a.xxx = b.xxx;UNION,UNION ALL:將兩個或多個表中相同列的數(shù)據(jù)展示出來
SELECT column FROM table1 UNION SELECT column FROM table2 ORDER BY column;注意UNION的列數(shù)和順序要相同,類型最好也相同,而內(nèi)、外連接SELECT里沒硬性要求
存儲過程和自定義函數(shù)的區(qū)別
存儲過程能有多個返回值,而函數(shù)只能有一個返回值
存儲過程聲明時不需要描述返回類型,而函數(shù)聲明時需要描述返回類型,且函數(shù)體中必須包含一個有效的RETURN語句
存儲過程的參數(shù)有IN、OUT、INOUT類型,而函數(shù)只有IN類型
存儲過程一般是作為一個獨立的部分來執(zhí)行( EXECUTE 語句執(zhí)行),而函數(shù)可以作為sql語句的一個部分來調(diào)用
一般來說,存儲過程實現(xiàn)的功能要復(fù)雜一點,而函數(shù)實現(xiàn)的功能針對性比較強(qiáng)
- 存儲過程的好處
???????存儲過程說白了就是把經(jīng)常使用的SQL語句或業(yè)務(wù)邏輯封裝起來,預(yù)編譯保存在數(shù)據(jù)庫中,當(dāng)需要的時候從數(shù)據(jù)庫中直接調(diào)用,省去了編譯的過程.,提高了運行速度, 同時降低網(wǎng)絡(luò)數(shù)據(jù)傳輸量(傳輸名字和參數(shù)即可)
什么是事務(wù)
???????事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂事務(wù),它是一個操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個不可分割的工作單位。
事務(wù)的四大特性
原子性(Atomicity):事務(wù)作為一個整體被執(zhí)行,包含在其中的對數(shù)據(jù)庫的操作要么全部被執(zhí)行,要么都不執(zhí)行
一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致狀態(tài)。
隔離性(Isolation):多個事務(wù)并發(fā)執(zhí)行時,一個事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行
持久性(Durability):已被提交的事務(wù)對數(shù)據(jù)庫的修改應(yīng)該永久保存在數(shù)據(jù)庫中
索引
索引分為兩大類:B樹類型索引和Hash類型索引
B樹類型索引分B+樹和B-樹,InnoDB和Myisam支持B樹類型索引,不支持Hash類型索引
B+樹層數(shù)越多,數(shù)據(jù)量指數(shù)值增長,InnoDB和Myisam默認(rèn)使用
Hash索引查詢單條快,范圍查詢慢,Memory、NDB支持
常用索引:
???????普通索引INDEX、唯一索引UNIQUE INDEX、主鍵索引PRIMARY KEY、組合索引INDEX(column1, column2, ...)和全文索引FULLTEXT INDEX
全文索引
只支持 char、varchar、text 類型;
性能比like高很多,但可能存在精度問題。
表中必須有 4 條以上的記錄
如果需要全文索引的是大量數(shù)據(jù),建議先添加數(shù)據(jù),再創(chuàng)建索引
自然全文索引:
SELECT xxx FROM table WHERE MATCH(fulltext_column) AGAINST('info');布爾全文索引:
SELECT xxx FROM table WHERE MATCH(fulltext_column) AGAINST('info' in boolean mode);
info里使用修飾符:
'+':必須包含該詞
'-':必須不包含該詞
'>':提高該詞的相關(guān)性,查詢的結(jié)果靠前
'<':降低該詞的相關(guān)性,查詢的結(jié)果靠后
'*':通配符,只能接在詞后面查看引擎搜索長度:
show variables like '%ft%';配置搜索長度:打開 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面,根據(jù)查看引擎搜索長度的格式,追加相應(yīng)內(nèi)容,并且重啟MySQL,輸入修復(fù)命令
repair table test quick;
視圖及其優(yōu)點
視圖是一個虛擬表,實質(zhì)是一條預(yù)編譯的SQL語句,并不保存實際數(shù)據(jù)
視圖通常只用作查詢,避免修改操作。若進(jìn)行修改操作,單表的視圖會將修改同步到源表,多表的視圖修改可能會出錯,因此修改數(shù)據(jù)操作應(yīng)在表上進(jìn)行
優(yōu)點:
簡單。對使用視圖的用戶來說視圖已經(jīng)是過濾好的復(fù)合條件的結(jié)果集,完全不需要關(guān)心后面對應(yīng)的表的結(jié)構(gòu)、關(guān)聯(lián)條件和篩選條件
安全。使用視圖的用戶只能訪問他們被允許查詢的特定的行或列,也就是視圖本身的內(nèi)容,不會涉及到視圖以外的數(shù)據(jù)
數(shù)據(jù)獨立。一旦視圖的結(jié)構(gòu)確定了,就相當(dāng)于有兩個表,用戶使用視圖可以屏蔽源表結(jié)構(gòu)變化的影響,源表發(fā)生變化時,可以修改視圖同步變化
視圖與臨時表的區(qū)別
視圖實質(zhì)是一條預(yù)編譯的SQL語句,不保存實際數(shù)據(jù),而臨時表是個真實的表
視圖只存在于單個查詢當(dāng)中,每次使用該視圖名,其虛擬表就會根據(jù)現(xiàn)有的數(shù)據(jù)重新被創(chuàng)建,而臨時表只存在于它被創(chuàng)建的整個數(shù)據(jù)庫會話過程中
視圖的內(nèi)容是在該視圖每次被使用的時候才生成,所以數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)是同步的,而臨時表一經(jīng)創(chuàng)建只能手動更新
建立視圖時可將原本數(shù)據(jù)隱藏起來換成另一種表達(dá)形式,更為安全還能改善應(yīng)用體驗,而臨時表只能直接復(fù)制
應(yīng)用場景
- 視圖用于查詢多的情況,需要安全性能更高的情況
- 臨時表用于更新多的情況,或者需要復(fù)制表的情況
SQL實現(xiàn)數(shù)據(jù)表的復(fù)制
select into from 和insert into select都是用來復(fù)制表.
兩者的主要區(qū)別為:
select into from 要求目標(biāo)表不存在,因為在插入時會自動創(chuàng)建
insert into select from 要求目標(biāo)表存在
兩者的語法:
SELECT vale1, value2 into Table2 from Table1
Insert into Table2(field1,field2,...) select value1,value2,... from Table1
NULL值的處理
- IS NULL:變量為NULL
- IS NOT NULL:變量不為NULL
- <=>:這才是MySQL語句的比較操作符