壓縮表從名字上來看,簡(jiǎn)單理解為壓縮后的表,也就是把原始表根據(jù)一定的壓縮算法按照一定的壓縮比率壓縮后生成的表。
十載的雙流網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整雙流建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“雙流網(wǎng)站設(shè)計(jì)”,“雙流網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
1.1 壓縮能力強(qiáng)的產(chǎn)品
表壓縮后從磁盤占用上看要比原始表要小很多。如果你熟悉列式數(shù)據(jù)庫,那對(duì)這個(gè)概念一定不陌生。比如,基于 PostgreSQL 的列式數(shù)據(jù)庫 Greenplum;早期基于 MySQL 的列式數(shù)據(jù)庫 inforbright;或者 Percona 的產(chǎn)品 tokudb 等,都是有壓縮能力非常強(qiáng)的數(shù)據(jù)庫產(chǎn)品。
1.2 為什么要用壓縮表?
情景一:磁盤大小為 1T,不算其他的空間占用,只能存放 10 張 100G 大小的表。如果這些表以一定的比率壓縮后,比如每張表從 100G 壓縮到 10G,那同樣的磁盤可以存放 100 張表,表的容量是原來的 10 倍。情景二:默認(rèn) MySQL 頁大小 16K,而 OS 文件系統(tǒng)一般塊大小為 4K,所以在 MySQL 在刷臟頁的過程中,有一定的概率出現(xiàn)頁沒寫全而導(dǎo)致數(shù)據(jù)壞掉的情形。比如 16K 的頁寫了 12K,剩下 4K 沒寫成功,導(dǎo)致 MySQL 頁數(shù)據(jù)損壞。這個(gè)時(shí)候就算通過 Redo Log 也恢復(fù)不了,因?yàn)閹缀跤兴械年P(guān)系數(shù)據(jù)庫采用的 Redo Log 都記錄了數(shù)據(jù)頁的偏移量,此時(shí)就算通過 Redo Log 恢復(fù)后,數(shù)據(jù)也是錯(cuò)誤的。所以 MySQL 在刷臟數(shù)據(jù)之前,會(huì)把這部分?jǐn)?shù)據(jù)先寫入共享表空間里的 DOUBLE WRITE BUFFER 區(qū)域來避免這種異常。此時(shí)如果 MySQL 采用壓縮表,并且每張表頁大小和磁盤塊大小一致,比如也是 4K,那 DOUBLE WRITE BUFFER 就可以不需要,這部分開銷就可以規(guī)避掉了。查看文件系統(tǒng)的塊大?。?/p>
root@ytt-pc:/home/ytt#??tune2fs?-l?/dev/mapper/ytt--pc--vg-root??|?grep?-i?'block?size'Block size: ? ? ? ? ? ? ? 4096
1.3 壓縮表的優(yōu)勢(shì)
壓縮表的優(yōu)點(diǎn)非常明顯,占用磁盤空間小!由于占用空間小,從磁盤置換到內(nèi)存以及之后經(jīng)過網(wǎng)絡(luò)傳輸都非常節(jié)省資源。
簡(jiǎn)單來講:節(jié)省磁盤 IO,減少網(wǎng)絡(luò) IO。
1.4 壓縮表的缺陷
當(dāng)然壓縮表也有缺點(diǎn),壓縮表的寫入(INSERT,UPDATE,DELETE)比普通表要消耗更多的 CPU 資源。
壓縮表的寫入涉及到解壓數(shù)據(jù),更新數(shù)據(jù),再壓縮數(shù)據(jù),比普通表多了解壓和再壓縮兩個(gè)步驟,壓縮和解壓縮需要消耗一定的 CPU 資源。所以需要選擇一個(gè)比較優(yōu)化的壓縮算法。
1.5 MySQL 支持的壓縮算法
這塊是 MySQL 所有涉及到壓縮的基礎(chǔ),不僅僅用于壓縮表,也用于其它地方。比如客戶端請(qǐng)求到 MySQL 服務(wù)端的數(shù)據(jù)壓縮;主從之間的壓縮傳輸;利用克隆插件來復(fù)制數(shù)據(jù)庫操作的壓縮傳輸?shù)鹊取?/p>
從下面結(jié)果可以看到 MySQL 支持的壓縮算法為 zlib 和 zstd,MySQL 默認(rèn)壓縮算法為 zlib,當(dāng)然你也可以選擇非 zlib 算法,比如 zstd。至于哪種壓縮算法最優(yōu),暫時(shí)沒辦法簡(jiǎn)單量化,依賴表中的數(shù)據(jù)分布或者業(yè)務(wù)請(qǐng)求。
在Jmeter中建立一個(gè)JDBC
Request
測(cè)試計(jì)劃主要分兩步。
(1)設(shè)置JDBC連接池(在JDBC
Connection
Configuration)
(2)添加JDBC
Request
其他步驟就是設(shè)置參數(shù)化、斷言、監(jiān)聽結(jié)果。
第一步:添加
JDBC
Connection
Configuration
需要設(shè)置jdbc線程池變量的名稱,這里設(shè)置為jdbcConfig,這個(gè)變量在JDBC
Request中要使用的;還有要設(shè)置Database
URL,格式為:jdbc:mysql://localhost:3306/chen?serverTimezone=UTCcharacterEncoding=utf-8,注意:?后面的serverTimezone=UTCcharacterEncoding=utf-8不能缺少,否則會(huì)報(bào)時(shí)區(qū)錯(cuò)誤。
第二部:設(shè)置JDBC
Request
使用--auto-generate-sql參數(shù)表示用mysqlslap工具自己生成的SQL腳本來測(cè)試并發(fā)壓力
mysqlslap --auto-generate-sql -uroot -p123456
并發(fā)測(cè)試,使用–concurrency來模擬并發(fā)連接,連接數(shù)可以多個(gè),用逗號(hào)隔開
mysqlslap --auto-generate-sql --concurrency=100 -uroot -p123456
mysqlslap --auto-generate-sql --concurrency=50,100 -uroot -p123456
使用--iterations模擬迭代測(cè)試,用于需要多次執(zhí)行測(cè)試得到平均值。
mysqlslap --auto-generate-sql --iterations=5 -uroot -p123456
使用--engine測(cè)試不同的存儲(chǔ)引擎的性能進(jìn)行對(duì)比
mysqlslap --auto-generate-sql --concurrency=50,100 --iterations=5 --engine=myisam,innodb -uroot -p123456
--query=name,-q 指定自定義腳本執(zhí)行測(cè)試,例如可以調(diào)用自定義的一個(gè)存儲(chǔ)過程或者sql語句來執(zhí)行測(cè)試。--create-schema 指定自定義的測(cè)試數(shù)據(jù)庫名稱,
mysqlslap --auto-generate-sql --concurrency=50,100 --create-schema="landclash" --query="call landclash.sp_player_getname(34);" --number-of-queries=5000 -uroot -p123456
中大型的數(shù)據(jù)庫,都支持跨操作系統(tǒng)。因此,在功能上絕不會(huì)有區(qū)別。小型數(shù)據(jù)庫,可能不支持。數(shù)據(jù)庫,分開源、閉源。
壓力測(cè)試工具mysqlslap 使用幫助--help介紹的很詳細(xì),下面是一些常用的選項(xiàng)。根據(jù)幫助文檔就可以自己敲命令進(jìn)行壓力測(cè)試了。
--concurrency代表并發(fā)數(shù)量,多個(gè)可以用逗號(hào)隔開,當(dāng)然你也可以用自己的分隔符隔開,這個(gè)時(shí)候要用到--delimiter開關(guān)。
--engines代表要測(cè)試的引擎,可以有多個(gè),用分隔符隔開。
--iterations代表要運(yùn)行這些測(cè)試多少次。
--auto-generate-sql 代表用系統(tǒng)自己生成的SQL腳本來測(cè)試。
--auto-generate-sql-load-type 代表要測(cè)試的是讀還是寫還是兩者混合的(read,write,update,mixed)
--number-of-queries 代表總共要運(yùn)行多少次查詢。每個(gè)客戶運(yùn)行的查詢數(shù)量可以用查詢總數(shù)/并發(fā)數(shù)來計(jì)算。比如倒數(shù)第二個(gè)結(jié)果2=200/100。
--debug-info 代表要額外輸出CPU以及內(nèi)存的相關(guān)信息。
--number-int-cols 代表示例表中的INTEGER類型的屬性有幾個(gè)。
--number-char-cols 意思同上。
--create-schema 代表自己定義的模式(在MySQL中也就是庫)。
--query 代表自己的SQL腳本。
--only-print 如果只想打印看看SQL語句是什么,可以用這個(gè)選項(xiàng)。
mysqlslap對(duì)于模擬多個(gè)用戶同時(shí)對(duì)MySQL發(fā)起“進(jìn)攻”提供了方便。同時(shí)詳細(xì)的提供了“高負(fù)荷攻擊MySQL”的詳細(xì)數(shù)據(jù)報(bào)告。而且如果你想對(duì)于多個(gè)引擎的性能。這個(gè)工具再好不過了。