數(shù)據(jù)庫存儲引擎
服務(wù)層
第二層是MySQL的核心,MySQL的核心服務(wù)層都在這一層挑随,查看解析状您,SQL執(zhí)行計劃、SQL執(zhí)行計劃優(yōu)化、查詢緩存膏孟。以及跨存儲引擎的功能都在這一層實現(xiàn):存儲功能眯分、觸發(fā)器、視圖等柒桑。通過下圖來觀察服務(wù)層的內(nèi)部結(jié)構(gòu)弊决。
存儲引擎層
負(fù)責(zé)MySQL中數(shù)據(jù)的存儲和提取。服務(wù)器中的查詢執(zhí)行引擎通過AP與存儲引擎通信魁淳,通過接口屏蔽了不同存儲引擎之間的差異飘诗。MySQL采用插件式的存儲引擎。MySQL為我們提供了很多的存儲引擎界逛,每種存儲引擎有不同的特點昆稿。我們根據(jù)不同的業(yè)務(wù)特點,選擇最合適的存儲引擎息拜。如果對于存儲引擎的性能不滿意溉潭,可以通過修改源碼來達(dá)到自己想要的性能。例如阿里巴巴的X-engine少欺,為了滿足企業(yè)需求facebook和goole都對InnoDB進(jìn)行了擴(kuò)充喳瓣。
查看存儲引擎
show engines;
MySQL引擎之MyISAM
MySQL5.5之前的版本默認(rèn)存儲引擎
MyISAM存儲引擎表有MYD(數(shù)據(jù)文件)和MYI(索引文件)組成。
什么是鎖
鎖主要是管理共享資源的并發(fā)訪問狈茉。
鎖用于實現(xiàn)事務(wù)的隔離性
鎖的類型
- 共享鎖(也稱讀鎖)夫椭,針對同一份數(shù)據(jù),多個操作可以同時進(jìn)行不相互影響
- 獨占鎖(也稱寫鎖)氯庆,當(dāng)前寫操作沒有完成前蹭秋,他會阻斷其他寫鎖和讀鎖
鎖的粒度
- 表級鎖
- 行級鎖
MyISAM
- 并發(fā)性與鎖級別
- 表損壞修復(fù)
repair table 表名稱;
- MyISAM表支持?jǐn)?shù)據(jù)壓縮(如果表中數(shù)據(jù)發(fā)生變化就要重新壓縮)
myisampack -b -f myIsam.MYI
- 節(jié)約空間
- 訪問速度快
MyISAM存儲引擎限制
- 版本<MySQL5.0時默認(rèn)表大小為4G,如存儲大表則要修改MAX_Rows和AVG_ROW_LENGTH
- 版本>MySQL5.0是默認(rèn)支持256TB
事務(wù)場景
- 非事務(wù)性應(yīng)用
- 只讀類應(yīng)用
MySQL引擎之InnoDB
MySQL引擎之InnoDB
MySQL5.5 及之后版本默認(rèn)存儲引擎,支持事務(wù)的ACID特性
Innodb使用表空間進(jìn)行數(shù)據(jù)存儲
show variables like 'innodb_file_per_table';
默認(rèn)on
set global variables=off;
設(shè)置為off
on:獨立表空間堤撵,tablename.ibd(在所屬數(shù)據(jù)庫目錄文件下)
off:系統(tǒng)表空間:ibdataX X是一個數(shù)字(在data目錄文件下)
系統(tǒng)表空間和獨立表空間如何選擇
- 系統(tǒng)表空間會產(chǎn)生IO瓶頸仁讨,刷新數(shù)據(jù)是順序進(jìn)行的所以會產(chǎn)生文件的IO瓶頸
- 獨立表空間可以同時向多個文件刷新數(shù)據(jù)
Innodb存儲引擎的特性
- 支持事務(wù)的ACID特性
- Innodb支持行級鎖,可以最大程度的支持并發(fā)
MyISAM和InnoDB對比
MySQL引擎之CSV
MySQL引擎之CSV
文件存儲特點
數(shù)據(jù)以文本方式存儲在文件中
.csv文件存儲表內(nèi)容
.csm文件存儲表的元數(shù)據(jù)如表狀態(tài)和數(shù)據(jù)量
.frm文件存儲表結(jié)構(gòu)信息
特點
以csv格式進(jìn)行存儲
注意:- 該類型文件不支持自增
- 不支持索引
- 不支持空的字段
使用場景
- 適合作為數(shù)據(jù)交換的中間表
MySQL引擎之Memory
MySQL引擎之Memory
也稱heap存儲引擎实昨,所有數(shù)據(jù)保存在內(nèi)存中洞豁,如果重啟MySQL服務(wù)數(shù)據(jù)會丟失,但是表結(jié)構(gòu)會保存下來
功能特點
- 支持hash索引和btree索引
- 一般默認(rèn)為hash索引
- 設(shè)置為btree索引語法
create index 索引名稱 using btree on 表名稱(字段名稱);
- 所有字段都為固定長度 varchar(10)=char(10)
- 不支持blog和text等大字段
- Memory存儲引擎使用表級鎖
如何選擇存儲引擎
大部分情況下荒给,InnoDB都是正確的選擇丈挟,可以簡單的歸納為一句話“除非需要用到InnoDB不具有的特性,并且沒有其他辦法可以替代志电,否則都應(yīng)該優(yōu)先選擇InnoDB存儲引擎”
參考條件
事務(wù)
如果應(yīng)用需要事務(wù)支持曙咽,那么InnoDB或者XtraDB是目前最穩(wěn)定和經(jīng)過驗證的選擇
備份
如果可以定期的關(guān)閉服務(wù)器來執(zhí)行備份,那么備份的因素可以忽略挑辆。反之例朱,如果需要在線熱備份孝情,那么選擇InnoDB就是基本的要求
崩潰恢復(fù)
MyISAM據(jù)庫存儲引擎
應(yīng)用舉例
- 日志型應(yīng)用(MyISM)
- 只讀或者大部分情況下只讀的表(MyISM)
- 訂單處理(InnoDB)
MySQL基準(zhǔn)測試
什么是基準(zhǔn)測試
基準(zhǔn)測試是一種測量和評估軟件性能指標(biāo)的活動用于建立某個時刻的性能基準(zhǔn),以便當(dāng)系統(tǒng)發(fā)生軟硬件變化時重新進(jìn)行基準(zhǔn)測試以評估變化對性能的影響洒嗤。
基準(zhǔn)測試是針對系統(tǒng)設(shè)置的一種壓力測試
基準(zhǔn)測試特點
直接箫荡、簡潔、易于比較渔隶,用于評估服務(wù)器的處理能力
可能不關(guān)心業(yè)務(wù)邏輯羔挡,所使用的查詢和業(yè)務(wù)的真實性可以和業(yè)務(wù)環(huán)境沒關(guān)系
壓力測試特點
- 對真實的業(yè)務(wù)數(shù)據(jù)進(jìn)行測試,獲得真實業(yè)務(wù)系統(tǒng)所能承受的能力
- 需要針對不同主題派撕,所使用到的數(shù)據(jù)和查詢也是真實用到的
- 基準(zhǔn)測試就是簡化了壓力測試
基準(zhǔn)測試的目的
- 建立MySQL服務(wù)器的性能基準(zhǔn)線婉弹,確定當(dāng)前MySQL服務(wù)器的運(yùn)行情況,確定優(yōu)化之后的效果
- 模擬比當(dāng)前系統(tǒng)更高的負(fù)載终吼,以找出系統(tǒng)的擴(kuò)展瓶頸镀赌,可以增加數(shù)據(jù)庫并發(fā),觀察QPS(每秒處理查詢數(shù))际跪,TPS(每秒處理事務(wù)數(shù))變化商佛,確定并發(fā)量與性能最優(yōu)關(guān)系
- 測試不同硬件、軟件和操作系統(tǒng)的配置
- 證明新的硬件設(shè)備是否配置正確
如何進(jìn)行基準(zhǔn)測試
對整個系統(tǒng)進(jìn)行基準(zhǔn)測試
優(yōu)點
- 能測試整個系統(tǒng)的性能姆打,包括服務(wù)器緩存良姆、數(shù)據(jù)庫等
- MySQL并不總是出現(xiàn)性能問題的瓶頸,如果只關(guān)注MySQL可能會忽略其他問題幔戏,能反映出系統(tǒng)中各個組件接口間的性能問題玛追,體現(xiàn)真實性能情況
缺點
- 基準(zhǔn)測試最主要的就是簡單,可能對不同的方案進(jìn)行測試闲延,找到最優(yōu)的方案痊剖,基準(zhǔn)測試進(jìn)行的時間一定要短,否則就要花費(fèi)大量的時間進(jìn)行基準(zhǔn)測試垒玲。
- 測試復(fù)雜陆馁,消耗時間長
對MySQL進(jìn)行基準(zhǔn)測試
優(yōu)點
- 測試設(shè)計簡單,消耗時間短
缺點
- 無法全面了解真?zhèn)€系統(tǒng)的性能基線
MySQL基準(zhǔn)測試的常見指標(biāo)
- 單位時間內(nèi)處理的事務(wù)數(shù)(TPS)
- 單位時間內(nèi)處理的查詢數(shù)(QPS)
MySQL基準(zhǔn)測試工具
MySQL基準(zhǔn)測試之mysqlslap
- 可以模擬服務(wù)器負(fù)載合愈,輸出相關(guān)統(tǒng)計信息
常用參數(shù)說明
- --auto-generate-sql 由系統(tǒng)自動生成SQL腳本進(jìn)行測試
- --auto-generate-sql-add-autoincrement 在生成的表中增加自增ID
- --auto-generate-sql-load-type 指定測試中使用的查詢類型 讀寫或者混合,默認(rèn)是混合
- --auto-generate-sql-write-number 指定初始化數(shù)據(jù)時生成的數(shù)據(jù)量
- --concurrency 指定并發(fā)線程的數(shù)量 1,10,50,200
- --engine 指定要測試表的存儲引擎,可以用逗號分割多個存儲引擎
- --no-drop 指定不清理測試數(shù)據(jù)
- --iterations 指定測試運(yùn)行的次數(shù) 指定了這個不能指定no-drop
- --number-of-queries 指定每一個線程執(zhí)行的查詢數(shù)量
- --debug-info 指定輸出額外的內(nèi)存及CPU統(tǒng)計信息
- --number-int-cols 指定測試表中包含的INT類型列的數(shù)量
- --number-char-cols 指定測試表中包含的varchar類型的數(shù)量
- --create-schema 指定了用于執(zhí)行測試的數(shù)據(jù)庫的名字
- --query 用于指定自定義SQL的腳本
- --only-print 并不運(yùn)行測試腳本,而是把生成的腳本打印出來
- 一條測試語句
mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=test -uroot -proot
sysbench測試工具:
https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html