其實mysql測試也沒有這麼複雜,除了一些常用的select\insert\update\deletc這些外,其實測試他的並發量才是最重要的。比如在串連數1K的時候,並發量能否滿足當前請求\伺服器效能、記憶體CPU使用方式。說白了,測試mysql就是測試他的設定檔和並發量及伺服器效能。
一、工具
首選工具mysql內建的:mysqlslap
–auto-generate-sql, -a
自動產生測試表和資料
–auto-generate-sql-load-type=type
測試語句的類型。取值包括:read,key,write,update和mixed(預設)。
–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參數指定的值做為分隔字元
–engine=engine_name, -e engine_name
建立測試表所使用的儲存引擎,可指定多個
–iterations=N, -i N
測試執行的迭代次數
–detach=N
執行N條語句後斷開重連
–debug-info, -T
列印記憶體和CPU的資訊
–only-print
只列印測試語句而不實際執行
———————————————————————————————-
測試的過程需要產生測試表,插入測試資料,這個mysqlslap可以自動產生,預設產生一個mysqlslap的schema,如果已經存在則先刪除,這裡要注意了,不要用–create-schema指定已經存在的庫,否則後果可能很嚴重。可以用–only-print來列印實際的測試過程:
# mysqlslap -a –only-print
DROP SCHEMA IF EXISTS `mysqlslap`; CREATE SCHEMA `mysqlslap`; use mysqlslap; CREATE TABLE `t1` (intcol1 INT(32) ,charcol1 VARCHAR(128)); INSERT INTO t1 VALUES (1804289383,'mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRD9rdxBL'); … SELECT intcol1,charcol1 FROM t1; INSERT INTO t1 VALUES (364531492,'qMa5SuKo4M5OM7ldvisSc6WK9rsNTGFxkDJ4EAwW'); DROP SCHEMA IF EXISTS `mysqlslap`;
可以看到最後由刪除一開始建立的schema的動作,整個測試完成後不會在資料庫中留下痕迹。假如我們執行一次測試,分別50和100個並發,執行1000次總查詢,那麼:
# mysqlslap -uroot -p123456 -a –concurrency=50,100 –number-of-queries 1000 –debug-info
Benchmark
Average number of seconds to run all queries: 0.375 seconds
Minimum number of seconds to run all queries: 0.375 seconds
Maximum number of seconds to run all queries: 0.375 seconds
Number of clients running queries: 50
Average number of queries per client: 20
Benchmark
Average number of seconds to run all queries: 0.453 seconds
Minimum number of seconds to run all queries: 0.453 seconds
Maximum number of seconds to run all queries: 0.453 seconds
Number of clients running queries: 100
Average number of queries per client: 10
User time 0.29, System time 0.11
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 4032, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 7319, Involuntary context switches 681
以上結果可以看出,50和100個並發分別得到一次測試結果(Benchmark),並發數越多,執行完所有查詢的時間越長。為了準確起見,可以多反覆項目測試幾次:
# mysqlslap -a –concurrency=50,100 –number-of-queries 1000 –iterations=5 –debug-info
Benchmark
Average number of seconds to run all queries: 0.380 seconds
Minimum number of seconds to run all queries: 0.377 seconds
Maximum number of seconds to run all queries: 0.385 seconds
Number of clients running queries: 50
Average number of queries per client: 20
Benchmark
Average number of seconds to run all queries: 0.447 seconds
Minimum number of seconds to run all queries: 0.444 seconds
Maximum number of seconds to run all queries: 0.451 seconds
Number of clients running queries: 100
Average number of queries per client: 10
User time 1.44, System time 0.67
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 17922, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 36796, Involuntary context switches 4093
測試同時不同的儲存引擎的效能進行對比:
# mysqlslap -uroot -p123456 -a -concurrency=50,100 –number-of-queries 1000 –iterations=5 –engine=myisam,innodb –debug-info
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 0.200 seconds
Minimum number of seconds to run all queries: 0.188 seconds
Maximum number of seconds to run all queries: 0.210 seconds
Number of clients running queries: 50
Average number of queries per client: 20
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 0.238 seconds
Minimum number of seconds to run all queries: 0.228 seconds
Maximum number of seconds to run all queries: 0.251 seconds
Number of clients running queries: 100
Average number of queries per client: 10
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 0.375 seconds
Minimum number of seconds to run all queries: 0.370 seconds
Maximum number of seconds to run all queries: 0.379 seconds
Number of clients running queries: 50
Average number of queries per client: 20
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 0.443 seconds
Minimum number of seconds to run all queries: 0.440 seconds
Maximum number of seconds to run all queries: 0.447 seconds
Number of clients running queries: 100
Average number of queries per client: 10
User time 2.83, System time 1.66
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 34692, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 87306, Involuntary context switches 10326
# mysqladmin -uroot -p123456 -i 10 extended status 每10秒重新整理一次
Aborted_connects 嘗試已經失敗的MySQL伺服器的串連的次數。
Connections 試圖串連MySQL伺服器的次數。
Created_tmp_tables 當執行語句時,已經被創造了的隱含暫存資料表的數量。
Delayed_insert_threads 正在使用的延遲插入處理器線程的數量。
Delayed_writes 用INSERT DELAYED寫入的行數。
Delayed_errors 用INSERT DELAYED寫入的發生某些錯誤(可能重複索引值)的行數。
Flush_commands 執行FLUSH命令的次數。
Handler_delete 請求從一張表中刪除行的次數。
Handler_read_first 請求讀入表中第一行的次數。
Handler_read_key 請求數字基於鍵讀行。
Handler_read_next 請求讀入基於一個鍵的一行的次數。
Handler_read_rnd 請求讀入基於一個固定位置的一行的次數。
Handler_update 請求更新表中一行的次數。
Handler_write 請求向表中插入一行的次數。
Key_blocks_used 用於關鍵字緩衝的塊的數量。
Key_read_requests 請求從緩衝讀入一個索引值的次數。
Key_reads 從磁碟物理讀入一個索引值的次數。
Key_write_requests 請求將一個關鍵字塊寫入緩衝次數。
Key_writes 將一個索引值塊物理寫入磁碟的次數。
Max_used_connections 同時使用的串連的最大數目。
Not_flushed_key_blocks 在金鑰快取中已經改變但是還沒被清空到磁碟上的鍵塊。
Not_flushed_delayed_rows 在INSERT DELAY隊列中等待寫入的行的數量。
Open_tables 開啟表的數量。
Open_files 開啟檔案的數量。
Open_streams 開啟流的數量(主要用於日誌記載)
Opened_tables 已經開啟的表的數量。
Questions 發往伺服器的查詢的數量。
Slow_queries 要花超過long_query_time時間的查詢數量。
Threads_connected 當前開啟的串連的數量。
Threads_running 不在睡眠的線程數量。
Uptime 伺服器工作了多少秒。