MySQL客戶端與服務(wù)端的通信方式是“半雙工”
全雙工:雙向通信,發(fā)送同時(shí)也可以接收
半雙工:雙向通信,同時(shí)只能發(fā)送或者接收,無(wú)法同時(shí)操作
單工:?jiǎn)蜗蛲ㄐ?/i>
通信狀態(tài)查詢 show processlist
查詢緩存
工作原理:
緩存select操作的結(jié)果集合SQL語(yǔ)句
新的select語(yǔ)句,先去查詢緩存,判斷是否存在可用的記錄集
存儲(chǔ)引擎
1、Active存儲(chǔ)引擎(壓縮協(xié)議進(jìn)行數(shù)據(jù)的存儲(chǔ));
特點(diǎn):只支持insert和select兩種操作;只允許自增id列建立索引;行級(jí)鎖;不支持事務(wù);數(shù)據(jù)占用磁盤(pán)少
2、MyISAM;3、Innodb;4、Memory存儲(chǔ)引擎
一、MyIsam和innodb的對(duì)比
1、MyISAM不支持事務(wù),Innodb是事務(wù)型存儲(chǔ)引擎。
2、MyISAM只支持表級(jí)鎖,Innodb默認(rèn)支持行級(jí)鎖
3、MyISAM不支持外鍵,Innodb支持外鍵
4、MyISAM支持全文索引,Innodb不支持
5、MyISAM引擎的查詢、更新、插入的效率都比innodb高
總結(jié):在讀多少寫(xiě)的應(yīng)用中還是Innodb插入性能更穩(wěn)定,如果對(duì)比讀取速度要求比較快的選MyISAM
附加:
1、MyISAM屬于堆表,在磁盤(pán)上有三個(gè)文件 .frm,.MYI(存放索引),.MYD(存放數(shù)據(jù)),支持三種不同的存儲(chǔ)方式:靜態(tài)表、動(dòng)態(tài)表、壓縮表
2、Innodb屬于索引組織表,支持兩種存儲(chǔ)方式:共享表空間存儲(chǔ)和多表空間存儲(chǔ)。
3、關(guān)于自動(dòng)增長(zhǎng):MyISAM引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引,自動(dòng)增長(zhǎng)列可以不是第一列;
Innodb引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引,自動(dòng)增長(zhǎng)列必須是組合索引的第一列
4、關(guān)于主鍵:MyISAM可以沒(méi)有主鍵和自動(dòng)索引,MyISAM的索引都是保存行地址
? ? Innodb引擎如果沒(méi)有設(shè)置主鍵或者非空的唯一索引,就會(huì)自動(dòng)生成一個(gè)6個(gè)字節(jié)的主鍵(用戶不可見(jiàn))
5、關(guān)于count函數(shù),如果沒(méi)有where條件,MyISAM保存表的總行數(shù),直接取就行
Innodb需要遍歷整個(gè)表,如果有where條件,處理方式一樣
二、事務(wù)
1、事務(wù)的ACID屬性
原子性、隔離性、持久性、最終一致性
2、并發(fā)事務(wù)帶來(lái)的幾個(gè)問(wèn)題
更新丟失、臟讀、不可重復(fù)讀、幻讀
3、事務(wù)的隔離級(jí)別
讀未提交、讀已提交、可重復(fù)讀(默認(rèn))、序列化
三、鎖
共享鎖、排他鎖、意向共享鎖(表鎖)、意向排他鎖(表鎖)、間隙鎖、臨鍵鎖、記錄鎖、死鎖
1、mysql死鎖怎么避免?怎么解決?
避免死鎖
1.1、類似的業(yè)務(wù)邏輯以固定的順序訪問(wèn)表和行
1.2、大事務(wù)拆小
1.3、同一個(gè)事務(wù)中,盡可能一次鎖定鎖需要的所有資源
1.4、為表添加合理是索引,避免表鎖
MySQL有兩種死鎖處理方式:
等待,直到超時(shí)(innodb_lock_wait_timeout=50s)。
發(fā)起死鎖檢測(cè),主動(dòng)回滾一條事務(wù),讓其他事務(wù)繼續(xù)執(zhí)行(innodb_deadlock_detect=on)。
由于性能原因,一般都是使用死鎖檢測(cè)來(lái)進(jìn)行處理死鎖。
2、innodb 如果沒(méi)加索引,寫(xiě)操作會(huì)加表鎖;如果加了所有,只加行鎖和間隙鎖
3、死鎖的條件
3.1)互斥條件
3.2)不可搶占條件
3.3)循環(huán)等待條件
4、樂(lè)觀鎖和悲觀鎖
4.1)悲觀鎖:一鎖二查三更新,需要數(shù)據(jù)庫(kù)本身提供支持 select 。。。 for update來(lái)實(shí)現(xiàn)
4.2)樂(lè)觀鎖:一般是邏輯上實(shí)現(xiàn),不需要數(shù)據(jù)庫(kù)本身提供支持,一般的做法是在需要的數(shù)據(jù)上增加一個(gè)版本號(hào)或者時(shí)間戳。
四、索引
正確的創(chuàng)建合適的索引,是提升mysql數(shù)據(jù)查詢性能的基礎(chǔ)。
索引是為了加速對(duì)表中數(shù)據(jù)行的檢索而創(chuàng)建的一種分散的數(shù)據(jù)結(jié)構(gòu)。
1、種類:
主鍵索引:數(shù)據(jù)記錄里面不能有null,數(shù)據(jù)內(nèi)容不能重復(fù),在一張表里面不能有多個(gè)主鍵索引。
唯一索引:字段數(shù)據(jù)是唯一的
組合索引:多個(gè)列建立索引
普通索引:使用字段關(guān)鍵字建立的索引,主要是提高查詢速度
全文索引:只有MyISAM支持
2、結(jié)構(gòu):B+Tree索引、Hash索引、全文索引(只有MyISAM支持)、RTree
備注:hash索引:由于hash的唯一及類似鍵值對(duì)的形式很適合做索引,可以一次定位,但是對(duì)于范圍查詢、排序、組合索引,效率不高
3、索引的優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
3.1、索引能極大的減少存儲(chǔ)引擎需要掃描的數(shù)據(jù)量
3.2、索引可以把隨機(jī)IO變?yōu)轫樞騃O
3.3、索引可以幫助我們?cè)诜纸M,排序等操作時(shí),避免使用臨時(shí)表
缺點(diǎn)
3.1)提高了查詢速度,但是降低了表的更新速度,因?yàn)楦卤淼臅r(shí)候,不僅要更新下數(shù)據(jù),還有更新下索引文件
3.2)建立索引文件會(huì)占用磁盤(pán)空間,一般情況不嚴(yán)重。但是在一個(gè)大表上建立多種組合索引,索引文件會(huì)增長(zhǎng)很快。
4、索引失效
4.1)如果條件中有or,即使其中有條件帶索引也不會(huì)使用,除非全都都是索引
4.2)對(duì)于組合索引,如果不滿足最左匹配原則,不使用索引
4.3)like查詢以%開(kāi)頭,不使用索引,如果離散度低,也不走索引
4.4)如果列是字符串類型,那一定要在條件中將數(shù)據(jù)用引號(hào)引用起來(lái),否者不使用索引
4.5)查詢的數(shù)量是大表的大部分,應(yīng)該是30%以上
4.6)對(duì)索引列進(jìn)行運(yùn)算
4.7)mysql使用不等于,無(wú)法使用索引
4.8)mysql中使用is not null 或 is null。
五、基礎(chǔ)理論
1、三范式
1.1)建表時(shí)要保證列的原子性(不可分割)
1.2)數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或記錄必須可以被唯一的區(qū)分
1.3)一個(gè)關(guān)系中不包含已在其他關(guān)系已包含的非關(guān)鍵字信息
2、drop、delete、truncate的區(qū)別和在什么場(chǎng)景下使用
2.1)drop
屬于DDL;不可回滾;不可帶where;刪除表結(jié)構(gòu)和內(nèi)容;刪除速度快
2.2)truncate
屬于DDL,不可回滾;不可帶where;刪除表內(nèi)容;刪除速度快
2.3)delete
屬于DML,可回滾;可帶where,刪除表內(nèi)容,刪除速度慢,需要逐行刪除
3、為什么選擇B+Tree作為索引結(jié)構(gòu)
3.1)B+樹(shù)掃庫(kù)、表能力更強(qiáng)
3.2)B+書(shū)的磁盤(pán)讀寫(xiě)能力更強(qiáng)
3.3)B+樹(shù)的排序能力更強(qiáng)
3.4)B+樹(shù)的查詢效率更穩(wěn)定
六、MVCC 多版本并發(fā)控制
避免寫(xiě)操作的阻塞,從而引發(fā)讀操作的并發(fā)問(wèn)題
1、mysql表中會(huì)默認(rèn)加兩列:數(shù)據(jù)行版本號(hào)、刪除版本號(hào);有個(gè)全局事務(wù)ID
2、查詢的規(guī)則
2.1、查詢數(shù)據(jù)行版本號(hào)早于當(dāng)前事務(wù)版本的數(shù)據(jù)行
2.2、查詢刪除行版本號(hào)要么為null,要么大于當(dāng)前事務(wù)版本號(hào)的記錄
七、undo Log 和redo Log
1、undo log:是為了實(shí)現(xiàn)事務(wù)的原子性而出現(xiàn)的產(chǎn)物
快照讀(普通的select就是快照讀)、當(dāng)前讀(SQL讀取的數(shù)據(jù)是最新版本,一般在修改數(shù)據(jù)的情況下)
2、redo log:是為了實(shí)現(xiàn)事務(wù)的持久性而產(chǎn)生的產(chǎn)物