術(shù)語(yǔ)
描述 | |
---|---|
數(shù)據(jù)結(jié)構(gòu) | 關(guān)系型數(shù)據(jù)庫(kù)由表組成 |
元組 | 表中的每行(即數(shù)據(jù)庫(kù)中的每條記錄)就是一個(gè)元組 |
空值 | Mysql難以優(yōu)化引用可空列查詢呀伙,它會(huì)使索引梆暮、索引統(tǒng)計(jì)和值比較更加復(fù)雜癌压,你應(yīng)該用0募强、一個(gè)特殊的值或者一個(gè)空串代替空值。 |
主碼 | 我們?cè)诮?shù)據(jù)庫(kù)的時(shí)候更卒,需要為每張表指定一個(gè)主碼,主碼也叫主鍵洛口,唯一標(biāo)識(shí)這一個(gè)元組 |
超碼 | 一個(gè)或多個(gè)屬性的集合矫付,這些屬性的組合可以使我們?cè)谝粋€(gè)實(shí)體集中唯一的標(biāo)識(shí)一個(gè)實(shí)體 |
候選碼 | 候選碼就是可以區(qū)別一個(gè)元組的屬性或?qū)傩缘募?/td> |
參照完整性 | 參照完整性主要是定義外碼,將一個(gè)關(guān)系的主碼放在另一個(gè)關(guān)系中,作為該關(guān)系的屬性,就稱(chēng)其為外碼 |
笛卡爾積 | R×S,R中的每一行分別與S中的每一行兩兩組合的結(jié)果 |
等值連接 | R.X=S.X第焰,取兩者中屬性值相等的元組 |
自然連接 | R.X=S.X买优,是一種特殊的等值連接,取兩者中屬性值相等的元組挺举,結(jié)果中重復(fù)屬性去掉 |
左連接 | 無(wú)論是否符合語(yǔ)句的表連接條件都會(huì)把左表的記錄全部查詢出來(lái)杀赢,右表只匹配符合條件的數(shù)據(jù)行,如果右表中沒(méi)有匹配行則為null(右表第一條記錄開(kāi)始掃描符合連接條件的記錄與左表記錄合并存到結(jié)果集湘纵,直到找不到符合條件的記錄并生成一個(gè)為NULL的右表列) |
SQL
描述 | |
---|---|
數(shù)據(jù)查詢語(yǔ)言DQL | SELECT |
數(shù)據(jù)操縱語(yǔ)言DML | INSERT/UPDATE/DELETE |
數(shù)據(jù)定義語(yǔ)言DDL | 表結(jié)構(gòu)創(chuàng)建/視圖/索引/同義詞/簇/約束 |
數(shù)據(jù)控制語(yǔ)言DCL | 數(shù)據(jù)庫(kù)權(quán)限以及事物操作 |
視圖 | 視圖是從一個(gè)或幾個(gè)基本表(或視圖)導(dǎo)出的表脂崔。它與基本表不同,是一個(gè)虛表梧喷。數(shù)據(jù)庫(kù)只存放視圖的定義砌左,而不存放視圖對(duì)應(yīng)的數(shù)據(jù) |
索引 | 索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定信息 |
同義詞 | 相當(dāng)于表的別名 |
簇 | 節(jié)省了磁盤(pán)存儲(chǔ)空間铺敌,因?yàn)樵瓉?lái)需要單獨(dú)存放多張表汇歹,現(xiàn)在可以將聯(lián)結(jié)的部分作為共享列的存儲(chǔ),適合經(jīng)常查詢偿凭、當(dāng)DML較少的表 |
約束 | 控制表屬性的手段 |
約束
描述 | |
---|---|
概念 | 約束用于限制加入表的數(shù)據(jù)的類(lèi)型 |
primary key | 不重復(fù)产弹,也不會(huì)出現(xiàn)空值 |
foreign key | 外鍵 |
unique | 唯一約束不允許出現(xiàn)重復(fù)的值,但是可以為多個(gè)NULL |
not null | 非空 |
auto_increment | 自增 |
default | 默認(rèn)值 |
外鍵 | 描述 |
---|---|
外鍵 | 如果公共關(guān)鍵字在一個(gè)關(guān)系中是主關(guān)鍵字弯囊,那么這個(gè)公共關(guān)鍵字被稱(chēng)為另一個(gè)關(guān)系的外鍵 |
優(yōu)點(diǎn) | 保證數(shù)據(jù)的完整性與關(guān)聯(lián)性 |
缺點(diǎn) | DML操作的時(shí)候痰哨,可能會(huì)鎖表,當(dāng)數(shù)據(jù)量大的時(shí)候常挚,性能差 |
默認(rèn)值 | 描述 |
---|---|
B樹(shù)不存NULL作谭,因此索引用不到NULL,如果字段為NULL會(huì)直接走全表查詢奄毡,建議使用默認(rèn)值給一個(gè)0或者'' |
觸發(fā)器
描述 | |
---|---|
概念 | 觸發(fā)器是與表事件相關(guān)的特殊的存儲(chǔ)過(guò)程折欠,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng)吼过,而是由事件來(lái)觸發(fā) |
INSTEAD OF 觸發(fā)器 | DML操作之前锐秦,檢查分支條件觸發(fā)各種動(dòng)作 |
AFTER 觸發(fā)器 | DML操作成功之后觸發(fā) |
優(yōu)點(diǎn) | 描述 |
---|---|
觸發(fā)器是SQL server 提供給程序員和數(shù)據(jù)分析員來(lái)保證數(shù)據(jù)完整性的一種方法(強(qiáng)制校驗(yàn)/級(jí)聯(lián)操作/類(lèi)型轉(zhuǎn)換) |
缺點(diǎn) | 描述 |
---|---|
可移植性差,維護(hù)困難盗忱,觸發(fā)器對(duì)表的每一行都會(huì)處理一個(gè)事務(wù), 數(shù)據(jù)量大且長(zhǎng)時(shí)間的操作酱床,對(duì)數(shù)據(jù)庫(kù)造成巨大壓力 |
事件
描述 | |
---|---|
概念 | 數(shù)據(jù)庫(kù)按自定義的時(shí)間周期觸發(fā)某種操作 |
優(yōu)點(diǎn) | 描述 |
---|---|
不再依賴外部程序,適合實(shí)時(shí)性要求較高的環(huán)境 |
缺點(diǎn) | 描述 |
---|---|
開(kāi)啟和關(guān)閉事件需要具有超級(jí)用戶權(quán)限趟佃,程序不可以調(diào)用扇谣,不適合復(fù)雜處理 |
游標(biāo)
描述 | |
---|---|
概念 | 游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制昧捷。盡管游標(biāo)能遍歷結(jié)果中的所有行,但他一次只指向一行 |
優(yōu)點(diǎn) | 描述 |
---|---|
可以對(duì)某個(gè)查詢結(jié)果集進(jìn)行單行操作罐寨,適合數(shù)據(jù)量小并且需要重復(fù)操作的結(jié)果集使用 |
缺點(diǎn) | 描述 |
---|---|
因?yàn)橛螛?biāo)是循環(huán)逐行處理靡挥,數(shù)據(jù)量大的時(shí)候效率低下 ,占用內(nèi)存也非常多 |
儲(chǔ)存過(guò)程
儲(chǔ)存過(guò)程 | 描述 |
---|---|
概念 | 存儲(chǔ)過(guò)程是為了完成特定功能的SQL語(yǔ)句集鸯绿,經(jīng)編譯創(chuàng)建并保存在數(shù)據(jù)庫(kù)中跋破。 |
優(yōu)點(diǎn) | 描述 |
---|---|
效率 | 開(kāi)發(fā)速度快,將復(fù)雜操作用存儲(chǔ)過(guò)程封裝 |
安全 | 可設(shè)定只有某些用戶才具有對(duì)指定存儲(chǔ)過(guò)程的使用權(quán) |
耦合 | 一定程度降低了業(yè)務(wù)系統(tǒng)與數(shù)據(jù)庫(kù)的耦合 |
性能 | 存儲(chǔ)過(guò)程大大地減少了業(yè)務(wù)系統(tǒng)與數(shù)據(jù)庫(kù)的交互瓶蝴,減少網(wǎng)絡(luò)通信量 |
執(zhí)行速度快 | 存儲(chǔ)過(guò)程只在創(chuàng)建時(shí)進(jìn)行編譯毒返,以后每次執(zhí)行存儲(chǔ)過(guò)程都不需要重新編譯,而一般SQL語(yǔ)句沒(méi)執(zhí)行一次就需編譯一次舷手,所以使用存儲(chǔ)過(guò)程可提高數(shù)據(jù)庫(kù)的執(zhí)行速度 |
缺點(diǎn) | 描述 |
---|---|
移植性差 | 不同數(shù)據(jù)庫(kù)的廠商語(yǔ)法不一致拧簸,當(dāng)切換到其他廠商的數(shù)據(jù)庫(kù)系統(tǒng)時(shí),需要重寫(xiě)原有的存儲(chǔ)過(guò)程 |
調(diào)試差 | 調(diào)試?yán)щy |
場(chǎng)景 | 描述 |
---|---|
業(yè)務(wù)操作不要放在存儲(chǔ)過(guò)程男窟,與無(wú)關(guān)業(yè)務(wù)的狡恬,各種報(bào)表,很復(fù)雜的查詢比較適合 |
SQL表設(shè)計(jì)
SQL表設(shè)計(jì) | 描述 |
---|---|
概念 | 基于ER模型的設(shè)計(jì)方法蝎宇,3NF的設(shè)計(jì)方法弟劲,統(tǒng)一建模語(yǔ)言(UML)方法等 |
ER模型 | 描述 |
---|---|
概念 | 提供不受任何DBMS約束的面向用戶的表達(dá)方法,在數(shù)據(jù)庫(kù)設(shè)計(jì)中被廣泛用作數(shù)據(jù)建模的工具 |
矩形 | 實(shí)體集 |
橢圓 | 實(shí)體屬性 |
菱形 | 聯(lián)系集 |
線段 | 描述屬性與實(shí)體集關(guān)系姥芥,或者實(shí)體集與聯(lián)系集關(guān)系 |
image.png
UML | 描述 |
---|---|
UML | 統(tǒng)一建模語(yǔ)言兔乞,用于說(shuō)明、可視化凉唐、構(gòu)建和編寫(xiě)一個(gè)正在開(kāi)發(fā)的庸追、面向?qū)ο蟮摹④浖芗到y(tǒng)的制品的開(kāi)放方法 |
3NF | 描述 |
---|---|
1NF | 每一列都是不可分割的基本數(shù)據(jù)項(xiàng)(不要企圖把多個(gè)屬性存儲(chǔ)到某一個(gè)列里面) |
2NF | 一個(gè)表必須有主鍵,即每行數(shù)據(jù)都能被區(qū)分 |
3NF | 一個(gè)表中不能包涵其他相關(guān)表中非關(guān)鍵字段的信息,即數(shù)據(jù)表不能有沉余字段 |
可讀(參考阿里巴巴建表規(guī)范)
命名 |
---|
表名一般以【模塊名稱(chēng)_詳細(xì)表名】來(lái)實(shí)現(xiàn)台囱,同一個(gè)模塊的前綴是一樣的 |
表達(dá)是與否概念的字段淡溯,必須使用 is_xxx 的方式命名 |
一些作為多對(duì)多連接的表,能夠使用兩個(gè)表的前綴作為表名 |
大小寫(xiě)規(guī)則不統(tǒng)一簿训,如:user_id咱娶,userId |
使用完整名稱(chēng),提高可讀性 |
唯一索引名為 uk_字段名强品;普通索引名則為 idx_字段名 |
附屬表拆分后膘侮,附屬表id與主表id保持一致 |
建議
表必備三字段:id, gmt_create, gmt_modified |
禁止使用復(fù)雜數(shù)據(jù)類(lèi)型(數(shù)組,自定義類(lèi)型等) |
觸發(fā)器/儲(chǔ)存過(guò)程/視圖/函數(shù)操作的榛, 最好別用 |
考慮分布式琼了,不使用外鍵約束 |
任何字段如果為非負(fù)數(shù),必須是無(wú)符號(hào)類(lèi)型 |
存在TEXT或者VARCHAR字節(jié)很大的時(shí)候,可以考慮拆分到其他表夫晌,內(nèi)存中存儲(chǔ)的數(shù)據(jù)條數(shù)可以大大增加 |
擴(kuò)展
擴(kuò)展性 | 描述 |
---|---|
手動(dòng)添加列 | 造成mysql鎖表雕薪,數(shù)據(jù)量大可能長(zhǎng)時(shí)間導(dǎo)致服務(wù)不可用 |
添加表存儲(chǔ) | 大量數(shù)據(jù)join性能較差 |
預(yù)留字段 | 空間浪費(fèi) |
JSON | 1:描述(Key)+業(yè)務(wù)信息(Value) 2:MongoDB昧诱,設(shè)計(jì)復(fù)雜 |
性能
字節(jié)范圍越小越快, 因?yàn)樗鼈冋加酶賰?nèi)存和CPU緩存 |
整型比字符操作代價(jià)更低,因?yàn)樽址托?duì)規(guī)則 |
Mysql難以優(yōu)化引用可空列查詢所袁,它會(huì)使索引鳄哭、索引統(tǒng)計(jì)和值比較更加復(fù)雜 |
日期和時(shí)間類(lèi)型
類(lèi)型 | 字節(jié) | 格式 | 描述 |
---|---|---|---|
DATE | 3 | YYYY-MM-DD | |
TIME | 3 | HH:MM:SS | |
YEAR | 1 | YYYY | |
DATETIME | 8 | YYYY-MM-DD HH:MM:SS | |
TIMESTAMP | 4 | YYYYMMDD HHMMSS | 通常情況下應(yīng)盡量使用TIMESTAMP,因?yàn)樗菵ATETIME效率更高 |
整數(shù)類(lèi)型
類(lèi)型 | 字節(jié) | 描述 |
---|---|---|
TINYINT | 1 | |
SMALLINT | 2 | |
MEDIUMINT | 3 | |
INT或INTEGER | 4 | |
BIGINT | 8 |
根據(jù)業(yè)務(wù)選擇合適的范圍纲熏,非負(fù)數(shù)選擇無(wú)符號(hào)
小數(shù)類(lèi)型
類(lèi)型 | 字節(jié) | 描述 |
---|---|---|
FLOAT | 4 | |
DOUBLE | 8 | |
DECIMAL | float 和 double 在存儲(chǔ)的時(shí)候,存在精度損失的問(wèn)題,小數(shù)直接使用decimal |
字符串類(lèi)型
類(lèi)型 | 字節(jié) | 描述 |
---|---|---|
CHAR | 0-255字節(jié) | 直接分配好內(nèi)存(占用定義的空間大谐怼)局劲,適合字符串長(zhǎng)度幾乎相等 |
VARCHAR | 0-65535 字節(jié) | 不預(yù)先分配存儲(chǔ)空間,varchar類(lèi)型存儲(chǔ)占用實(shí)際數(shù)據(jù)大小的空間 |
TEXT | 0-65 535字節(jié) | |
BLOB | 0-65 535字節(jié) | 存儲(chǔ)例如圖片奶赠、音視頻這種文件的二進(jìn)制數(shù)據(jù)的 |
注意點(diǎn) |
---|
如果一個(gè)數(shù)據(jù)表存在varchar字段鱼填,則表中的char字段將自動(dòng)轉(zhuǎn)為varchar字段 |
varchar(10)比varchar(100)消耗內(nèi)存更少,因?yàn)関archar的數(shù)據(jù)緩存到內(nèi)存中時(shí)毅戈,需要預(yù)先分配的緩存空間等于定義時(shí)最大的數(shù)據(jù)空間 |
InnoDB 引擎單一字段索引的長(zhǎng)度最大為 767 字節(jié)苹丸。當(dāng)使用 UTF-8 字符集,每一個(gè)字符使用 3 字節(jié)來(lái)存儲(chǔ)苇经,即 255*3=765赘理,所以一般都不會(huì)設(shè)置超過(guò)varchar(255) |
物理存儲(chǔ)介質(zhì)
image.png
儲(chǔ)存器 | 描述 |
---|---|
高速緩沖存儲(chǔ)器 | 高速緩沖存儲(chǔ)器主要是用來(lái)在內(nèi)存和CPU之間作個(gè)數(shù)據(jù)緩沖的橋梁,因?yàn)镃PU的處理速度是所有計(jì)算機(jī)硬件中最快的扇单,內(nèi)存轉(zhuǎn)換的速度跟不上CPU的處理速度商模,需要有個(gè)緩沖區(qū)域 |
主存儲(chǔ)器 | 是計(jì)算機(jī)硬件的一個(gè)重要部件,其作用是存放指令和數(shù)據(jù)蜘澜,并能由中央處理器(CPU)直接隨機(jī)存取施流,內(nèi)存也被稱(chēng)為主存儲(chǔ)器 |
快閃存儲(chǔ)器 | 閃存是一種非易失性存儲(chǔ)器,即斷電數(shù)據(jù)也不會(huì)丟失鄙信。 |
磁盤(pán) | 通常整一個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)在磁盤(pán)瞪醋,為了可以數(shù)據(jù)訪問(wèn):先經(jīng)過(guò)主存儲(chǔ)器(內(nèi)存操作),指令完成之后才寫(xiě)回磁盤(pán) |
光盤(pán) | 光存儲(chǔ)器是指用光學(xué)方法從光存儲(chǔ)媒體上讀取和存儲(chǔ)數(shù)據(jù)的一種設(shè)備装诡。DVD之類(lèi)的 |
磁帶 | 以磁帶為存儲(chǔ)介質(zhì)银受,由磁帶機(jī)及其控制器組成的存儲(chǔ)設(shè)備,是計(jì)算機(jī)的一種輔助存儲(chǔ)器 |
I/O
I/O | 描述 |
---|---|
數(shù)據(jù)庫(kù)存儲(chǔ)I/O | 數(shù)據(jù)庫(kù)運(yùn)行中會(huì)不斷和存儲(chǔ)端產(chǎn)生交互鸦采,這個(gè)過(guò)程會(huì)產(chǎn)生I/O蚓土,而主主存儲(chǔ)器的大小會(huì)決定存儲(chǔ)的I/O數(shù)量 |
優(yōu)化 |
---|
數(shù)據(jù)庫(kù)I/O是以Page的方式占用內(nèi)存,如何數(shù)據(jù)庫(kù)每行數(shù)據(jù)越小赖淤,Page中的行數(shù)就越多蜀漆,處理速度越快,所以盡可能的選擇適合的數(shù)據(jù)類(lèi)型咱旱,字符編碼 |
由于查詢?nèi)罩緯?huì)記錄用戶的所有操作确丢,其中還包含增刪查改等信息绷耍,在并發(fā)操作大的環(huán)境下會(huì)產(chǎn)生大量的信息從而導(dǎo)致不必要的磁盤(pán)IO,會(huì)影響mysql的性能的鲜侥。如若不是為了調(diào)試數(shù)據(jù)庫(kù)的目的建議不要開(kāi)啟查詢?nèi)罩?/td> |
在MYSQL中褂始,對(duì)帶有可變字符串類(lèi)型的數(shù)據(jù)進(jìn)行了刪除操作,依然保存在表的數(shù)據(jù)文件之中描函,過(guò)大的數(shù)據(jù)文件會(huì)導(dǎo)致MySQL執(zhí)行相關(guān)數(shù)據(jù)操作時(shí)需要耗費(fèi)更多的性能和時(shí)間崎苗,清理碎片時(shí)MySQL會(huì)鎖定表,MySQL官方建議一般根據(jù)實(shí)際情況舀寓,只需要每周或者每月整理一次即可 |
MYSQL默認(rèn)配置性能低下胆数,需要調(diào)整配置參數(shù)提高性能 |
文件組織
文件組織 | 描述 |
---|---|
快 | 快是數(shù)據(jù)在文件中存儲(chǔ)和讀取的基本單元 ,一個(gè)塊可能包含多條記錄,每條記錄都存儲(chǔ)在相同的塊中互墓,對(duì)于大數(shù)據(jù)(圖片必尼,視頻),需要單獨(dú)存儲(chǔ)篡撵,并在記錄中保存指向大數(shù)據(jù)的指針 |
映射文件 | 數(shù)據(jù)庫(kù)映射到多個(gè)文件中判莉,同一文件中只存儲(chǔ)固定長(zhǎng)度的記錄或者構(gòu)建特殊的文件,支持容納不定長(zhǎng)度的記錄育谬。將數(shù)據(jù)庫(kù)映射到文件的兩種方法:定長(zhǎng)記錄與變長(zhǎng)記錄 |
定長(zhǎng)記錄 | 定長(zhǎng)記錄占用固定大小的存儲(chǔ)空間 |
變長(zhǎng)記錄 | 對(duì)于記錄中的定長(zhǎng)屬性券盅,分配存儲(chǔ)它們的值所需的字節(jié)數(shù) |
文件中記錄組織方式 | 堆文件組織/順序文件組織/散列文件組織/多表聚簇文件組織 |
數(shù)據(jù)庫(kù)緩存區(qū)
數(shù)據(jù)庫(kù)緩存區(qū) | 描述 |
---|---|
緩沖區(qū) | 主存儲(chǔ)器中的一部分,用于存儲(chǔ)磁盤(pán)塊拷貝膛檀。每個(gè)塊總有一個(gè)拷貝存放在磁盤(pán)上渗饮,負(fù)責(zé)緩沖器的空間分配的子系統(tǒng)就是緩沖區(qū)管理器 |
緩沖區(qū)管理器 | 當(dāng)緩沖區(qū)中沒(méi)有剩余空間時(shí),在新塊讀入緩沖區(qū)之前必須把一個(gè)塊從緩沖區(qū)中移除宿刮,多數(shù)操作系統(tǒng)使用 LRU 策略 |
LRU | 如果一個(gè)數(shù)據(jù)在最近一段時(shí)間沒(méi)有被訪問(wèn)到互站,那么在將來(lái)它被訪問(wèn)的可能性也很小,也就是說(shuō)僵缺,當(dāng)限定的空間已經(jīng)存滿數(shù)據(jù)時(shí)胡桃,應(yīng)當(dāng)把最久沒(méi)有被訪問(wèn)到的數(shù)據(jù)淘汰 |
磁盤(pán)訪問(wèn)模式:
訪問(wèn)模式 | 描述 |
---|---|
順序訪問(wèn) | 連續(xù)的請(qǐng)求會(huì)請(qǐng)求與處于相同或相鄰磁道上連續(xù)的塊 |
隨機(jī)訪問(wèn) | 相繼的請(qǐng)求會(huì)請(qǐng)求隨機(jī)位于磁盤(pán)上的塊,每次請(qǐng)求都需要一次磁盤(pán)尋道磕潮,數(shù)據(jù)傳輸率明顯低于順序訪問(wèn)模式 |
臨時(shí)表
臨時(shí)表 | 描述 |
---|---|
臨時(shí)表概念 | MySQL臨時(shí)表分為內(nèi)存臨時(shí)表和磁盤(pán)臨時(shí)表 翠胰,磁盤(pán)臨時(shí)表從5.7版本開(kāi)始臨時(shí)表的默認(rèn)存儲(chǔ)引擎變?yōu)閕nnodb |
MySQL臨時(shí)表類(lèi)型 | MySQL臨時(shí)表類(lèi)型 分為 外部臨時(shí)表 與 內(nèi)部臨時(shí)表 |
外部臨時(shí)表 | 通過(guò)create temporary table語(yǔ)法創(chuàng)建的臨時(shí)表,這類(lèi)表在會(huì)話結(jié)束后,會(huì)被自動(dòng)清理 |
內(nèi)部臨時(shí)表 | 通常在執(zhí)行復(fù)雜SQL自脯,那么MySQL內(nèi)部將使用自動(dòng)生成的臨時(shí)表以輔助SQL的執(zhí)行 |
內(nèi)部臨時(shí)表以及出現(xiàn)場(chǎng)景 |
---|
使用臨時(shí)表一般都意味著性能比較低之景,特別是使用磁盤(pán)臨時(shí)表,性能更慢膏潮,因此我們?cè)趯?shí)際應(yīng)用中應(yīng)該盡量避免臨時(shí)表的使用 |
GROUP BY的列沒(méi)有索引 |
ORDER BY和GROUP BY 使用了表的列不同 |
在JOIN查詢中锻狗,ORDER BY或者GROUP BY使用了不是第一個(gè)表的列 |
ORDER BY中使用了DISTINCT關(guān)鍵字 |
表包含TEXT或者BLOB列 |
GROUP BY 或者 DISTINCT 子句中包含長(zhǎng)度大于512字節(jié)的列 |
使用UNION或者UNION ALL時(shí),SELECT子句中包含大于512字節(jié)的列 |
全表掃描
全表掃描 |
---|
通常在數(shù)據(jù)庫(kù)中,對(duì)無(wú)索引的表進(jìn)行查詢一般稱(chēng)為全表掃描 |
使用NULL做為判斷條件 |
左模糊和全模糊都不能成功利用索引 |
OR語(yǔ)句連接的條件中包含的列沒(méi)有全部建立索引 |
查詢條件中使用了不等于操作符<>或!= 轻纪,X 油额!= 0 改為 X >0 OR X < 0 |
IN:一般情況下IN中的條件太多,優(yōu)化器傾向于全表掃描刻帚。否則照樣會(huì)走索引的潦嘶,查詢條件,如果子查詢結(jié)果集比主查詢結(jié)果集小應(yīng)該用IN, 否則子查詢結(jié)果集大用EXISTS |
NOT IN 和NOT EXISTS崇众,NOT IN 全表掃描掂僵,NOT EXISTS子查詢依然用到索引 |
WHERE 子句中對(duì)字段進(jìn)行表達(dá)式操作 如:where num/2 = 100 |
WHERE 子句中對(duì)字段進(jìn)行函數(shù)操作 |
索引
索引 | 描述 |
---|---|
索引概念 | 索引是一種數(shù)據(jù)結(jié)構(gòu),以索引表的形式存儲(chǔ)在磁盤(pán)中顷歌,索引查找過(guò)程中就要產(chǎn)生磁盤(pán)I/O消耗 |
哈希索引 | 只有Memory引擎支持哈希索引锰蓬,哈希索引基于哈希表實(shí)現(xiàn),存儲(chǔ)引擎都會(huì)對(duì)所有的索引列計(jì)算一個(gè)哈希碼衙吩,將所有的哈希碼存儲(chǔ)在索引中,同時(shí)在哈希表中保存指向每個(gè)數(shù)據(jù)行的指針 |
哈希索引查詢范圍 | 哈希索引只支持等值比較查詢溪窒,=坤塞、in、<=>(等價(jià)于:a=1 <=> a=3-2) |
B+Tree | InnoDB也使用B+Tree作為索引結(jié)構(gòu) 澈蚌,數(shù)據(jù)都在葉子節(jié)點(diǎn)上摹芙,具有順序訪問(wèn)指針,每個(gè)葉子節(jié)點(diǎn)都指向相鄰的葉子節(jié)點(diǎn)的地址 |
B+Tree單列索引范圍 | <,<=,=,>,>=,between,like(右邊模糊)適用索引 |
聚簇索引 | 在InnoDB中宛瞄,即存儲(chǔ)主鍵索引值浮禾,又存儲(chǔ)行數(shù)據(jù),稱(chēng)之為聚簇索引 |
非聚簇索引 | Myisam引擎的索引文件和數(shù)據(jù)文件是獨(dú)立分開(kāi)的份汗,則稱(chēng)之為非聚簇索引盈电。 |
最左原則 | 創(chuàng)建聯(lián)合索引時(shí),索引信息存儲(chǔ)在葉節(jié)點(diǎn)的Data域杯活,數(shù)據(jù)庫(kù)進(jìn)行檢索的時(shí)候匆帚,會(huì)根據(jù)聯(lián)合索引的字段從左開(kāi)始匹配,直到匹配完成 |
普通索引 | 當(dāng)一個(gè)表有多條索引可走時(shí), Mysql 根據(jù)查詢語(yǔ)句的成本來(lái)選擇走哪條索引旁钧,想檢索同時(shí)多個(gè)字段就考慮使用復(fù)合索引 |
唯一索引 | 索引列的所有值都必須不一致 |
主鍵索引 | 主鍵 |
復(fù)合索引 | 將多個(gè)字段創(chuàng)建到一個(gè)域里吸重,空間會(huì)更小 |
全文索引 | 全文索引可以在VARCHAR或者 TEXT類(lèi)型的列上創(chuàng)建 |
索引的代價(jià) | 創(chuàng)建索引會(huì)創(chuàng)建索引文件,DML操作時(shí)歪今,也會(huì)修改索引文件修改嚎幸,降低DML性能 |
驅(qū)動(dòng)表與基礎(chǔ)表 | 索引設(shè)計(jì)與優(yōu)化:每次加載相當(dāng)于一次隨機(jī)讀,所以普遍的優(yōu)化方案是小表作為驅(qū)動(dòng)表 |
EXPLAIN
EXPLAIN | 概念 | 作用 |
---|---|---|
id | SELECT識(shí)別符,相當(dāng)sql執(zhí)行序號(hào) | sql執(zhí)行順序,id相同由上至下寄猩,不同表示:id越大執(zhí)行優(yōu)先級(jí)越高 |
select_type | sql查詢類(lèi)型 | DEPENDENT SUBQUERY (會(huì)嚴(yán)重消耗性能):子查詢的查詢方式依賴于外面的查詢結(jié)果嫉晶,如:SELECT * FROM TABLE_A WHERE x = ( SELECT x FROM TABLE_B WHERE id = 1) |
table | 所訪問(wèn)數(shù)據(jù)庫(kù)中表名稱(chēng) | 所訪問(wèn)數(shù)據(jù)庫(kù)中表名稱(chēng) |
type | 索引類(lèi)型級(jí)別 | ALL、index、range车遂、 ref封断、eq_ref、const舶担、system坡疼、NULL(從左到右,性能從差到好) |
possible_keys | 查詢涉及到的字段上的引將被列出衣陶,NULL代表沒(méi)有索引 | |
Key | 實(shí)際使用的索引柄瑰,NULL代表沒(méi)有索引 | |
key_len | 顯示索引字段的長(zhǎng)度(字段字節(jié)*3) | |
ref | const表示:表的連接匹配條件用到的值,NULL代表:連接條件沒(méi)走索引 | |
rows | 通過(guò)索引查詢到的 數(shù)據(jù)數(shù)目 | |
filtered | 按表?xiàng)l件過(guò)濾的行百分比 |
Extra |
---|
通常在數(shù)據(jù)庫(kù)中剪况,對(duì)無(wú)索引的表進(jìn)行查詢一般稱(chēng)為全表掃描 |
Using filesort:無(wú)法利用索引完成的排序操作則會(huì)出現(xiàn), 消耗大 |
Using temporary : 使用了臨時(shí)表教沾,消耗大 |
Using index :不用讀取表中所有信息,僅通過(guò)索引就可以獲取所需數(shù)據(jù)(性能最好) |
Using where:需要讀取表信息 |
SQL執(zhí)行順序
執(zhí)行順序 |
---|
FROM译断、WHERE授翻、GROUP BY、HAVING孙咪、SELECT堪唐、ORDER BY |
SQL書(shū)寫(xiě)順序
關(guān)鍵字 | 執(zhí)行順序 | 注意點(diǎn) | |
---|---|---|---|
索引 | sql解析順序 | 索引創(chuàng)建順序和sql解析順序保持一致 | |
FROM | 從右到左 | 將數(shù)據(jù)量最小的表作為基礎(chǔ)表(最后面的表),3 個(gè)以上的表連接查詢選擇交叉表作為基礎(chǔ)表(交集表) | |
WHERE | 從右到左 | 過(guò)濾掉最大數(shù)量記錄的條件必須寫(xiě)在WHERE子句的末尾 | |
GROUP BY | 左往右分組 | 將不需要的記錄在GROUP BY 之前過(guò)濾掉翎蹈,即在GROUP BY前使用WHERE來(lái)過(guò)慮 | |
HAVING | WHERE子句在GROUP BY前限制記錄的數(shù)目,那就能減少這方面的開(kāi)銷(xiāo) | 消耗大 | |
SELECT | 數(shù)據(jù)庫(kù)解析過(guò)程中淮菠,會(huì)將 * 轉(zhuǎn)化為列名, 這個(gè)工作是通過(guò)查詢數(shù)據(jù)字典完成的, 這意味著將耗費(fèi)更多的時(shí)間 | ||
ORDER BY | 從左到右排序 | 消耗大 |
ORDER BY |
---|
兩種排序算法:雙路排序和單路排序(MySQL4.1之后默認(rèn)使用) |
雙路排序:兩次磁盤(pán)掃描,先從磁盤(pán)讀取排序字段并在緩沖區(qū)進(jìn)行排序,再?gòu)拇疟P(pán)取其他字段 |
單路排序 : 全部讀取并在緩沖區(qū)按照排序列排序(如果數(shù)據(jù)量太大超出緩沖區(qū)容量則進(jìn)行分批讀取荤堪,造成多次I/O) |
緩存區(qū)大小由參數(shù) : read_rnd_buffer_size |
單路排序:max_length_for_sort_data |
慢查詢?nèi)罩?/h1>
慢查詢?nèi)罩?/th> |
---|
慢查詢?nèi)罩臼荕ySQL提供的一種日志記錄合陵,它記錄MySQL中響應(yīng)時(shí)間超過(guò)閾值的語(yǔ)句,具體指運(yùn)行時(shí)間超過(guò)long_query_time值(默認(rèn)值為 10秒)的sql語(yǔ)句澄阳,該sql語(yǔ)句會(huì)被記錄到慢查詢?nèi)罩局?/td> |
慢查詢?nèi)罩緯?huì)對(duì)數(shù)據(jù)庫(kù)性能帶來(lái)影響拥知,只在調(diào)優(yōu)時(shí)開(kāi)啟 |
Show Profile
Show Profile |
---|
Show Profile是可以用來(lái)分析當(dāng)前會(huì)話過(guò)程中執(zhí)行的語(yǔ)句的資源使用情況 |
全局查詢?nèi)罩?/h1>
全局查詢?nèi)罩?/th> |
---|
全局查詢?nèi)罩居糜谟涗汼QL語(yǔ)句的執(zhí)行,可以查看語(yǔ)句執(zhí)行時(shí)間 |
事物
描述 | |
---|---|
概念 | 一個(gè)數(shù)據(jù)庫(kù)事務(wù)通常包含了一個(gè)序列的對(duì)數(shù)據(jù)庫(kù)的讀/寫(xiě)操作 |
目的 | 為數(shù)據(jù)庫(kù)操作序列提供了一個(gè)從失敗中恢復(fù)到正常狀態(tài)的方法碎赢,在異常狀態(tài)下仍能保持一致性举庶,為了實(shí)現(xiàn)將數(shù)據(jù)庫(kù)狀態(tài)恢復(fù)到一致?tīng)顟B(tài)的功能,通常需要維護(hù)事務(wù)日志以追蹤事務(wù)中所有影響數(shù)據(jù)庫(kù)數(shù)據(jù)的操作 |
原子性 | 事務(wù)作為一個(gè)整體被執(zhí)行揩抡,包含在其中的對(duì)數(shù)據(jù)庫(kù)的操作要么全部被執(zhí)行户侥,要么都不執(zhí)行 |
一致性 | 數(shù)據(jù)完整性約束的遵循 |
隔離性 | 多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),一個(gè)事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行 |
持久性 | 已被提交的事務(wù)對(duì)數(shù)據(jù)庫(kù)的修改應(yīng)該永久保存在數(shù)據(jù)庫(kù)中 |
并發(fā)控制
并發(fā)控制 | 描述 |
---|---|
并發(fā)控制概念 | 數(shù)據(jù)庫(kù)是容許多個(gè)事物并發(fā)執(zhí)行峦嗤,為了保證數(shù)據(jù)事物互不干擾而出現(xiàn)的一種機(jī)制:并發(fā)控制 |
事物并發(fā)問(wèn)題
描述 | |
---|---|
臟讀 | 讀取了未提交事物并回滾 |
不可重復(fù)讀 | 相關(guān)數(shù)據(jù)項(xiàng)被更新(數(shù)據(jù)發(fā)生了更改) |
幻讀 | 相關(guān)數(shù)據(jù)項(xiàng)新增了數(shù)據(jù)(數(shù)據(jù)行數(shù)不一致) |
事務(wù)隔離級(jí)別
事務(wù)隔離級(jí)別 | 描述 | 并發(fā)問(wèn)題 |
---|---|---|
未提交讀(Read uncommitted) | 一個(gè)事務(wù)可以讀到另外一個(gè)事務(wù)未提交的數(shù)據(jù) | 臟讀/不可重復(fù)讀/幻讀 |
提交讀(Read committed) | 事務(wù)未提交蕊唐,其他事務(wù)不能讀該數(shù)據(jù) | 不可重復(fù)讀/幻讀 |
可重復(fù)讀(Repeatable reads) | 同一事務(wù)多次讀,讀到的數(shù)據(jù)項(xiàng)都是一致的 | 幻讀 |
可序列化(Serializable) | 整個(gè)表加上鎖 |
鎖協(xié)議
鎖協(xié)議 | 描述 |
---|---|
鎖協(xié)議概念 | 事物申請(qǐng)加鎖約定的規(guī)矩稱(chēng)為鎖協(xié)議 |
加鎖方式 | 基本鎖類(lèi)型:共享鎖與排它鎖 |
一級(jí)鎖協(xié)議(未提交讀) | 事物修改數(shù)據(jù)項(xiàng)時(shí)烁设,加寫(xiě)鎖 |
二級(jí)鎖協(xié)議(提交讀) | 基于一級(jí)鎖協(xié)議替梨,寫(xiě)鎖釋放(寫(xiě)鎖釋放完代表事物已經(jīng)提交了) 钓试,加讀鎖,讀完釋放 |
三級(jí)鎖協(xié)議(可重復(fù)讀) | 基于一級(jí)鎖協(xié)議副瀑,寫(xiě)鎖釋放弓熏,加讀鎖,事物結(jié)束釋放(事物結(jié)束釋放代表:其他事物獲取不到寫(xiě)鎖糠睡,不能進(jìn)行寫(xiě)操作) |
四級(jí)鎖協(xié)議(可序列化) | 與事物相關(guān)的表都加表鎖 |