天天看點

性能壓測資料告訴你MySQL和MariaDB該怎麼選

作者:spbdev

1. 壓測環境

為了盡可能的客觀公正,本次選擇同一實體機上的兩台虛拟機,一台用作資料庫伺服器,一台用作運作壓測工具mysqlslap,作業系統均為Ubuntu Server 22.04LTS。

資料庫伺服器的虛拟機配置:2核4G(配置雖低,但是用作橫向對比不影響結果),安裝完系統做好基本配置後即建立快照便于快速恢複,這樣MySQL和MariaDB都運作在同一台虛拟機當中,排除環境因素導緻的性能影響。壓測資料也采用導出和導入的方式,確定資料完全一緻。

MySQL和MariaDB版本分别為8.0.32和10.11.2,均為目前最新穩定版。壓測工具mysqlslap。

性能壓測資料告訴你MySQL和MariaDB該怎麼選

壓測的大緻過程:

1、 安裝資料庫,分别生成30萬和200萬兩種壓測資料,分别用mysqldump導出資料備份。

2、 重新恢複到虛拟機快照,全新安裝MariaDB,導入備份資料進行壓測,記錄壓測結果。

3、 重新複到虛拟機快照,安裝MySQL,導入備份資料進行壓測,記錄壓測結果。

4、 每次壓測前先執行2次壓測,不記錄結果,作為資料庫的熱身。從第3次開始記錄,連續測試5次,取平均值。

2. 壓測過程

2.1. 生成壓測資料

主要就是建立表和模拟資料,實際使用資料庫大部分時候會用到兩表關聯查詢,且通常是查詢索引字段,但通常不是主鍵,是以建立兩張表user和userlog,通過字段uname(varchar,有索引)進行關聯查詢。

其中user表固定1萬條資料,userlog表分别模拟30萬和200萬條資料兩種情況壓測。

為節約篇幅,建表語句略。

  • 資料模拟
mysqlslap --create-schema=test --no-drop -c 100 -i 100 -h 10.0.2.12 -u user -p'user123!' --query="insert ignore into \`user\`(uname, age) values(SUBSTR(TO_BASE64(CONCAT(10000000000+rand()*1000000000,rand()*1000000000)),4,16), 10+rand()*70)";

mysqlslap --create-schema=test --no-drop -c 1 -i 30 -h 10.0.2.12 -u user -p'user123!' --query="insert ignore into userlog (rid, uname, val) select uuid(), uname, rand()*5000000 from \`user\`"           
  • 備份資料
sudo mysqldump --databases test -u root>test_30w.sql           

2.2.安裝資料庫和恢複資料

2.3. 壓測

# 并發50/100/200/300連接配接,每個連接配接隻查詢1次;循環10次
mysqlslap --create-schema=test --no-drop -c 100 -i 10 -h 10.0.2.12 -u user -p'user123!' --query=" set @val=round(rand()*10000);select u.uname,u.age,l.rid,l.val from user u join userlog l on u.uname=l.uname where u.rid=@val limit 20;"

# 并發100/200/300連接配接,每個連接配接查詢10次,不循環。
mysqlslap --create-schema=test --no-drop -c 100 --number-of-queries 1000 -h 10.0.2.12 -u user -p'user123!' --query=" set @val=round(rand()*10000);select u.uname,u.age,l.rid,l.val from user u join userlog l on u.uname=l.uname where u.rid=@val limit 20;"           

3. 壓測結果

壓測結果資料如下:

性能壓測資料告訴你MySQL和MariaDB該怎麼選
性能壓測資料告訴你MySQL和MariaDB該怎麼選

可以看出,不同資料量和不同壓力下,MariaDB的性能要比MySQL高10%到30%。是以,怎麼選不言自明。

繼續閱讀