mysql性能测试工具msyqlslap_mysqlslap工具测试mysql DB的性能
mysqlslap的一個主要工作場景就是對數據庫服務器做基準測試。
測試方法
1、測試工具:mysqlslap,mysqlslap是MySQL5.1.4之后自帶的benchmark基準測試工具,該工具可以模擬多個客戶端同時并發的向服務器發出查詢更新,給出了性能測試數據而且提供了多種引擎的性能比較。
2、測試流程:建立測試數據庫database和待測試的表tables → 根據table的結構,利用腳本生成一定數量的有效隨機數據 → 利用mysqlslap對相應query語句進行測試 → 結果數據的分析。
3、關鍵語句:考慮到資源平臺的實際應用情況,通過資源屬性查詢資源的操作為主要操作,且這類操作的耗時占總操作耗時的比例為最大,故對應這類操作的查詢語句為關鍵語句,對整個數據庫性能影響很大,我們可以通過測試這個關鍵語句得出的結果來評估整個數據庫的性能。
使用語法如下:
# mysqlslap [options]
常用參數 [options] 詳細說明:
--auto-generate-sql, -a 自動生成測試表和數據,表示用mysqlslap工具自己生成的SQL腳本來測試并發壓力。
--auto-generate-sql-load-type=type 測試語句的類型。代表要測試的環境是讀操作還是寫操作還是兩者混合的。取值包括:read,key,write,update和mixed(默認)。
--auto-generate-sql-add-auto-increment 代表對生成的表自動添加auto_increment列,從5.1.18版本開始支持。
--number-char-cols=N, -x N 自動生成的測試表中包含多少個字符類型的列,默認1
--number-int-cols=N, -y N 自動生成的測試表中包含多少個數字類型的列,默認1
--number-of-queries=N 總的測試查詢次數(并發客戶數×每客戶查詢次數)
--query=name,-q 使用自定義腳本執行測試,例如可以調用自定義的一個存儲過程或者sql語句來執行測試。
--create-schema 代表自定義的測試庫名稱,測試的schema,MySQL中schema也就是database。
--commint=N 多少條DML后提交一次。
--compress, -C 如果服務器和客戶端支持都壓縮,則壓縮信息傳遞。
--concurrency=N, -c N 表示并發量,也就是模擬多少個客戶端同時執行select。可指定多個值,以逗號或者--delimiter參數指定的值做為分隔符。例如:--concurrency=100,200,500。
--engine=engine_name, -e engine_name 代表要測試的引擎,可以有多個,用分隔符隔開。例如:--engines=myisam,innodb。
--iterations=N, -i N 測試執行的迭代次數,代表要在不同并發環境下,各自運行測試多少次。
--only-print 只打印測試語句而不實際執行。
--detach=N 執行N條語句后斷開重連。
--debug-info, -T 打印內存和CPU的相關信息。
更詳細的參數請查閱官網文檔:https://dev.mysql.com/doc/refman/5.7/en/mysqlslap.html#option_mysqlslap_debug-info
說明:
測試的過程需要生成測試表,插入測試數據,這個mysqlslap可以自動生成,默認生成一個mysqlslap的schema,如果已經存在則先刪除。可以用--only-print來打印實際的測試過程,整個測試完成后不會在數據庫中留下痕跡。
測試過程
mysqlslap的運行有如下3個步驟:
1. 創建schema、table、test data 等,使用單個連接 (在MySQL中,schema就是database);
2. 運行負載測試,可以使用多個并發客戶端連接;
3. 測試環境清理(刪除創建的數據、表等,斷開連接),使用單個連接。
1、建表:
通過屬性查詢資源需要兩張表:設備表device和設備屬性對應表deviceattr。device表對應資源,記錄資源的基本信息,如name,type,group,creator等等;deviceattr表對應資源和屬性的關系,記錄每個資源的每個屬性和屬性值;它們的結構如下所示:
通過多個屬性組合查詢deviceattr表,獲得相應的id ,id即是滿足條件的設備id,進而能直接在device表中查詢得到其基本屬性。
本次測試的關鍵語句即是從deviceattr表中組合查詢出滿足條件的id,故本測試只需要用到deviceattr一張表。
2、生成隨機數據并插入相應的表中:
這里編寫了幾個生成隨機數據的sql函數rand_name(),rand_value(),rand_num(),rand_creator(),并編寫了存儲過程insert_devattr,用來將一定量數據批量插入deviceattr表中。
然后將整個建表和存儲數據的過程寫進一個sql腳本中,并在mysql中運行這個腳本,待測試的表和數據就建立好了。(sql腳本在附錄)如下圖所示,生成的deviceattr隨機數據有4020條:
3、利用mysqlslap進行測試:
整個數據庫的關鍵操作為通過屬性查詢資源,該操作的關鍵sql語句就是:
select id from deviceattr where [ n attr ] group by id;
例:查詢擁有attr10或者attr20屬性的所有資源的id為:
select id from deviceattr where name = ‘attr10’ or name = ‘attr20’ group by id;
在建立好待測數據庫后,就可以利用mysqlslap進行測試,mysqlslap命令如下所示:
shell?< mysqlslap --create-schema='test1' --query="select id from deviceattr where name='attr10' or name='attr20' group by id;" -c 50 -i 100
以上語句表示:使用test1數據庫,使用query所指定的語句,測試50個并發查詢,每一個查詢100次。
該語句的測試結果如下圖所示:
結果中可以看到執行語句的平均耗時,最大耗時和最小耗時,并發線程數等等。
附錄:
生成測試數據的sql腳本:
use test1
drop table if exists device,attr,deviceattr;
drop function if exists rand_name;
drop function if exists rand_value;
drop function if exists rand_num;
drop function if exists rand_creator;
drop procedure if exists insert_devattr;
drop procedure if exists insert_dev;
create table device
(
id int primary key,
name varchar(40),
type varchar(40),
aquired int,
groupname varchar(40),
creator varchar(40)
);
create table attr
(
id int primary key,
name varchar(40)
);
create table deviceattr
(
id int,
name varchar(40),
value varchar(40)
);
delimiter //
create function rand_creator()
returns varchar(20)
begin
declare return_str varchar(20) default 'aronhe';
declare n int default 0;
set n = floor(rand()*10);
case n
when 0 then set return_str = 'aronhe';
when 1 then set return_str = 'eeelin';
when 2 then set return_str = 'shadowyang';
when 3 then set return_str = 'luzhao';
when 4 then set return_str = 'tommyzhang';
when 5 then set return_str = 'pillarzou';
when 6 then set return_str = 'allenpan';
when 7 then set return_str = 'beyondli';
when 8 then set return_str = 'minshi';
when 9 then set return_str = 'bingchen';
else set return_str = 'joyhu';
end case;
return return_str;
end//
create function rand_num()
returns int
begin
declare n int default 0;
set n = floor(rand()*100);
return n;
end//
create function rand_value()
returns varchar(10)
begin
declare return_str varchar(10) default 'false';
declare n int default 0;
set n = floor(rand()*10);
case
when n<5 then set return_str = 'false';
when n>5 then set return_str = 'true';
else set return_str = 'true';
end case;
return return_str;
end//
create function rand_name()
returns varchar(20)
begin
declare return_str varchar(20) default '';
set return_str = concat('attr',floor(rand()*200));
return return_str;
end//
create procedure insert_devattr(in start int,in max int)
begin
declare i int default 0;
repeat
set i=i+1;
insert into deviceattr values(rand_num(),rand_name(),rand_value());
until i =max
end repeat;
end//
create procedure insert_dev(in start int,in max int)
begin
declare i int default 10;
repeat
set i=i+1;
insert into device values(i,concat('runner',floor(rand()*100)),'pc',floor(rand()*2),'PCQQ',rand_creator());
until i =max
end repeat;
end//
call insert_devattr(0,4000)//
call insert_dev(11,100)//
實例
單線程測試。測試做了什么。
# mysqlslap -a -uroot -p123456
多線程測試。使用–concurrency來模擬并發連接。
# mysqlslap -a -c 100 -uroot -p123456
迭代測試。用于需要多次執行測試得到平均值。
# mysqlslap -a -i 10 -uroot -p123456
# mysqlslap ---auto-generate-sql-add-autoincrement -a -uroot -p123456
# mysqlslap -a --auto-generate-sql-load-type=read -uroot -p123456
# mysqlslap -a --auto-generate-secondary-indexes=3 -uroot -p123456
# mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -p123456
# mysqlslap --create-schema world -q "select count(*) from City" -uroot -p123456
# mysqlslap -a -e innodb -uroot -p123456
# mysqlslap -a --number-of-queries=10 -uroot -p123456
測試同時不同的存儲引擎的性能進行對比:
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -p123456
執行一次測試,分別50和100個并發,執行1000次總查詢:
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -p123456
50和100個并發分別得到一次測試結果(Benchmark),并發數越多,執行完所有查詢的時間越長。為了準確起見,可以多迭代測試幾次:
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -p123456
總結
以上是生活随笔為你收集整理的mysql性能测试工具msyqlslap_mysqlslap工具测试mysql DB的性能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql union order by
- 下一篇: mysql有三种事务模式_MySQL之事