關(guān)系型數(shù)據(jù)庫(kù)

術(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)的表都加表鎖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挽鞠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子狈孔,更是在濱河造成了極大的恐慌信认,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件均抽,死亡現(xiàn)場(chǎng)離奇詭異笨奠,居然都是意外死亡幕侠,警方通過(guò)查閱死者的電腦和手機(jī)嗅定,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)暇检,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人深寥,你說(shuō)我怎么就攤上這事攘乒。” “怎么了翩迈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵持灰,是天一觀的道長(zhǎng)盔夜。 經(jīng)常有香客問(wèn)我负饲,道長(zhǎng),這世上最難降的妖魔是什么喂链? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任返十,我火速辦了婚禮,結(jié)果婚禮上椭微,老公的妹妹穿的比我還像新娘洞坑。我一直安慰自己,他們只是感情好蝇率,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布迟杂。 她就那樣靜靜地躺著,像睡著了一般本慕。 火紅的嫁衣襯著肌膚如雪排拷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,021評(píng)論 1 291
  • 那天锅尘,我揣著相機(jī)與錄音监氢,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浪腐,可吹牛的內(nèi)容都是我干的纵揍。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼议街,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泽谨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起傍睹,我...
    開(kāi)封第一講書(shū)人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤隔盛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后拾稳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吮炕,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年访得,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了龙亲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悍抑,死狀恐怖鳄炉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搜骡,我是刑警寧澤拂盯,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站记靡,受9級(jí)特大地震影響谈竿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摸吠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一空凸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寸痢,春花似錦呀洲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至献烦,卻和暖如春滓窍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仿荆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工贰您, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坏平,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓锦亦,卻偏偏與公主長(zhǎng)得像舶替,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杠园,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容