1
創(chuàng)新互聯(lián)是專(zhuān)業(yè)的平果網(wǎng)站建設(shè)公司,平果接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行平果網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
使用--auto-generate-sql參數(shù)表示用mysqlslap工具自己生成的SQL腳本來(lái)測(cè)試并發(fā)壓力
mysqlslap --auto-generate-sql -uroot -p123456
2
并發(fā)測(cè)試,使用–concurrency來(lái)模擬并發(fā)連接,連接數(shù)可以多個(gè),用逗號(hào)隔開(kāi)
mysqlslap --auto-generate-sql --concurrency=100 -uroot -p123456
mysqlslap --auto-generate-sql --concurrency=50,100 -uroot -p123456
3
使用--iterations模擬迭代測(cè)試,用于需要多次執(zhí)行測(cè)試得到平均值。
mysqlslap --auto-generate-sql --iterations=5 -uroot -p123456
4
使用--engine測(cè)試不同的存儲(chǔ)引擎的性能進(jìn)行對(duì)比
mysqlslap --auto-generate-sql --concurrency=50,100 --iterations=5 --engine=myisam,innodb -uroot -p123456
5
--query=name,-q 指定自定義腳本執(zhí)行測(cè)試,例如可以調(diào)用自定義的一個(gè)存儲(chǔ)過(guò)程或者sql語(yǔ)句來(lái)執(zhí)行測(cè)試。--create-schema 指定自定義的測(cè)試數(shù)據(jù)庫(kù)名稱,
mysqlslap --auto-generate-sql --concurrency=50,100 --create-schema="landclash" --query="call landclash.sp_player_getname(34);" --number-of-queries=5000 -uroot -p123456
1、mysqlslap
安裝:簡(jiǎn)單,裝了mysql就有了
作用:模擬并發(fā)測(cè)試數(shù)據(jù)庫(kù)性能。
優(yōu)點(diǎn):簡(jiǎn)單,容易使用。
不足:不能指定生成的數(shù)據(jù)規(guī)模,測(cè)試過(guò)程不清楚針對(duì)十萬(wàn)級(jí)還是百萬(wàn)級(jí)數(shù)據(jù)做的測(cè)試,感覺(jué)不太適合做綜合測(cè)試,比較適合針對(duì)既有數(shù)據(jù)庫(kù),對(duì)單個(gè)sql進(jìn)行優(yōu)化的測(cè)試。
使用方法:
可以使用mysqlslap --help來(lái)顯示使用方法:
Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
--concurrency代表并發(fā)數(shù)量,多個(gè)可以用逗號(hào)隔開(kāi),concurrency=10,50,100, 并發(fā)連接線程數(shù)分別是10、50、100個(gè)并發(fā)。
--engines代表要測(cè)試的引擎,可以有多個(gè),用分隔符隔開(kāi)。
--iterations代表要運(yùn)行這些測(cè)試多少次。
--auto-generate-sql 代表用系統(tǒng)自己生成的SQL腳本來(lái)測(cè)試。
--auto-generate-sql-load-type 代表要測(cè)試的是讀還是寫(xiě)還是兩者混合的(read,write,update,mixed)
--number-of-queries 代表總共要運(yùn)行多少次查詢。每個(gè)客戶運(yùn)行的查詢數(shù)量可以用查詢總數(shù)/并發(fā)數(shù)來(lái)計(jì)算。
--debug-info 代表要額外輸出CPU以及內(nèi)存的相關(guān)信息。
--number-int-cols :創(chuàng)建測(cè)試表的 int 型字段數(shù)量
--auto-generate-sql-add-autoincrement : 代表對(duì)生成的表自動(dòng)添加auto_increment列,從5.1.18版本開(kāi)始
--number-char-cols 創(chuàng)建測(cè)試表的 char 型字段數(shù)量。
--create-schema 測(cè)試的schema,MySQL中schema也就是database。
--query 使用自定義腳本執(zhí)行測(cè)試,例如可以調(diào)用自定義的一個(gè)存儲(chǔ)過(guò)程或者sql語(yǔ)句來(lái)執(zhí)行測(cè)試。
--only-print 如果只想打印看看SQL語(yǔ)句是什么,可以用這個(gè)選項(xiàng)。
mysqlslap -umysql -p123 --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam --number-of-queries=10 --debug-info
或:
指定數(shù)據(jù)庫(kù)和sql語(yǔ)句:
mysqlslap -h192.168.3.18 -P4040 --concurrency=100 --iterations=1 --create-schema='test' --query='select * from test;' --number-of-queries=10 --debug-info -umysql -p123
要是看到底做了什么可以加上:--only-print
Benchmark
Average number of seconds to run all queries: 25.225 seconds
Minimum number of seconds to run all queries: 25.225 seconds
Maximum number of seconds to run all queries: 25.225 seconds
Number of clients running queries: 100
Average number of queries per client: 0
以上表明100個(gè)客戶端同時(shí)運(yùn)行要25秒
2、sysbench
安裝:
可以從 下載
tar zxf sysbench-0.4.12.tar.gz
cd sysbench-0.4.12
./autogen.sh
./configure make make install
strip /usr/local/bin/sysbench
安裝時(shí)候可能會(huì)報(bào)錯(cuò),后來(lái)baidu發(fā)現(xiàn)個(gè)好文 怕以后找不到,也貼過(guò)來(lái)吧
1.如果mysql不是默認(rèn)路徑安裝,那么需要通過(guò)指定--with-mysql-includes和--with-mysql-libs參數(shù)來(lái)加載mysql安裝路徑
2.如果報(bào)錯(cuò):
../libtool: line 838: X--tag=CC: command not found
../libtool: line 871: libtool: ignoring unknown tag : command not found
../libtool: line 838: X--mode=link: command not found
../libtool: line 1004: *** Warning: inferring the mode of operation is deprecated.: command not found
../libtool: line 1005: *** Future versions of Libtool will require --mode=MODE be specified.: command not found
../libtool: line 2231: X-g: command not found
../libtool: line 2231: X-O2: command not found
那么執(zhí)行下根目錄的:autogen.sh文件,然后重新configure make make install
3.如果報(bào)錯(cuò):
sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
那么執(zhí)行下:
n -s /usr/local/mysql5.5/mysql/lib/libmysqlclient.so.18 /usr/lib64/
4.如果執(zhí)行autogen.sh時(shí),報(bào)如下錯(cuò)誤:
./autogen.sh: line 3: aclocal: command not found
那么需要安裝一個(gè)軟件:
yum install automake
然后需要增加一個(gè)參數(shù):查找: AC_PROG_LIBTOOL 將其注釋?zhuān)缓笤黾覣C_PROG_RANLIB
作用:模擬并發(fā),可以執(zhí)行CPU/內(nèi)存/線程/IO/數(shù)據(jù)庫(kù)等方面的性能測(cè)試。數(shù)據(jù)庫(kù)目前支持MySQL/Oracle/PostgreSQL
優(yōu)點(diǎn):可以指定測(cè)試數(shù)據(jù)的規(guī)模,可以單獨(dú)測(cè)試讀、寫(xiě)的性能,也可以測(cè)試讀寫(xiě)混合的性能。
不足:測(cè)試的時(shí)候,由于網(wǎng)絡(luò)原因,測(cè)試的非常慢,但是最終給的結(jié)果卻很好,并發(fā)支持很高,所以給我的感覺(jué)是并不太準(zhǔn)確。當(dāng)然也可能我沒(méi)搞明白原理
使用方法:
準(zhǔn)備數(shù)據(jù)
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=400000 --mysql-db=dbtest2 --mysql-user=root --mysql-host=192.168.1.101 --mysql-password=pwd prepare
執(zhí)行測(cè)試
sysbench --num-threads=100 --max-requests=4000 --test=oltp --mysql-table-engine=innodb --oltp-table-size=400000 --mysql-db=dbtest1 --mysql-user=root --mysql-host=192.168.1.101 --mysql-password=pwd run
sysbench 0.4.12: multi-threaded system evaluation benchmark
No DB drivers specified, using mysql
Running the test with following options:
Number of threads: 100
Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 4000
Threads started!
Done.
OLTP test statistics:
queries performed:
read: 56014
write: 20005
other: 8002
total: 84021
transactions: 4001 (259.14 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 76019 (4923.75 per sec.)
other operations: 8002 (518.29 per sec.)
Test execution summary:
total time: 15.4393s
total number of events: 4001
total time taken by event execution: 1504.7744
per-request statistics:
min: 33.45ms
avg: 376.10ms
max: 861.53ms
approx. 95 percentile: 505.65ms
Threads fairness:
events (avg/stddev): 40.0100/0.67
execution time (avg/stddev): 15.0477/0.22
3、tpcc-mysql
安裝:
如果從原網(wǎng)站上下載源碼比較麻煩,需要工具、注冊(cè)、生成證書(shū)等。這里提供一個(gè)下載包
export C_INCLUDE_PATH=/usr/include/mysql
export PATH=/usr/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib/mysql
cd /tmp/tpcc/src
make
然后就會(huì)在 /tmp/tpcc-mysql 下生成 tpcc 命令行工具 tpcc_load 、 tpcc_start
作用:測(cè)試mysql數(shù)據(jù)庫(kù)的整體性能
優(yōu)點(diǎn):符合tpcc標(biāo)準(zhǔn),有標(biāo)準(zhǔn)的方法,模擬真實(shí)的交易活動(dòng),結(jié)果比較可靠。
不足:不能單獨(dú)測(cè)試讀或者寫(xiě)的性能,對(duì)于一些以查詢?yōu)橹骰蛘咧粚?xiě)的應(yīng)用,就沒(méi)有這么大的意義了。
使用方法:
加載數(shù)據(jù)
創(chuàng)建庫(kù)
mysqlcreate database tpcc10;
創(chuàng)建表:
shellmysql tpcc10 create_table.sql
添加外鍵:
shellmysql tpcc10 add_fkey_idx.sql
加載數(shù)據(jù):
1、單進(jìn)程加載:
shell./tpcc_load 192.168.11.172 tpcc10 root pwd 300
|主機(jī)||數(shù)據(jù)庫(kù)||用戶||密碼||warehouse|
2、并發(fā)加載:(推薦,但需要修改一下)
shell./load.sh tpcc300 300
|數(shù)據(jù)庫(kù)||warehouse|
3、測(cè)試
./tpcc_start -h192.168.11.172 -d tpcc -u root -p 'pwd' -w 10 -c 10 -r 10 -l 60 -i 10 -f /mnt/hgfs/mysql/tpcc100_2013522.txt
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
option h with value '192.168.11.172'
option d with value 'tpcc'
option u with value 'root'
option p with value 'pwd'
option w with value '1'
option c with value '100'
option r with value '120'
option l with value '60'
option i with value '10'
option f with value '/mnt/hgfs/mysql/tpcc100_2013522.txt'
Parameters
[server]: 192.168.11.172
[port]: 3306
[DBname]: tpcc
[user]: root
[pass]: pwd
[warehouse]: 1
[connection]: 100
[rampup]: 120 (sec.)
[measure]: 60 (sec.)
RAMP-UP TIME.(120 sec.)
MEASURING START.
硬件提升方法有:使用高速陣列磁盤(pán)、固態(tài)硬盤(pán)、甚至RAM磁盤(pán);加大機(jī)器內(nèi)存,調(diào)整核心參數(shù)使用更多的內(nèi)存
軟件方法有:建立合理的索引,優(yōu)化表的結(jié)構(gòu)(符合范式),優(yōu)化程序(盡量用主鍵訪問(wèn)數(shù)據(jù))
數(shù)據(jù)庫(kù)作為應(yīng)用開(kāi)發(fā)中必不缺少的基礎(chǔ)設(shè)施,其性能直接影響應(yīng)用的整體運(yùn)行速度。MySQL是目前最廣泛使用的關(guān)系型數(shù)據(jù)庫(kù)之一,對(duì)于開(kāi)發(fā)人員寫(xiě)出性能良好的SQL是必備的基本技能之一。下面簡(jiǎn)單描述下編寫(xiě)SQL的注意事項(xiàng)。
編寫(xiě)高質(zhì)量的SQL需要從以下幾個(gè)方面注意,基本原則、表字段注意事項(xiàng)、索引使用注意事項(xiàng)、SQL注意事項(xiàng)。
基本原則
一、盡量不要在數(shù)據(jù)庫(kù)里做運(yùn)算。如果遇到運(yùn)算盡可能在應(yīng)用程序?qū)舆M(jìn)行計(jì)算。
二、控制數(shù)據(jù)庫(kù)表數(shù)量、控制單表數(shù)據(jù)量、控制表的字段數(shù)。建議單庫(kù)不要超過(guò)四百?gòu)埍?,建議單表字段不要超過(guò)五十個(gè),建議單表的數(shù)據(jù)量不要超過(guò)一千萬(wàn)。
三、不要編寫(xiě)大SQL、不要使用大事務(wù)。SQL盡量寫(xiě)的簡(jiǎn)單點(diǎn)拒絕編寫(xiě)大SQL,可以將大SQL拆分成多個(gè)小SQL,在應(yīng)用層聚合。大事務(wù)拆分成多個(gè)小事務(wù),快速提交。
表字段注意事項(xiàng)
一、選擇合適數(shù)值字段類(lèi)型。能用小字段類(lèi)型的就用小字段類(lèi)型,如tinyint就比int(1)在表示小數(shù)據(jù)時(shí)合適。
二、能用數(shù)字表示就不要用字符。如可以用無(wú)符號(hào)INT存儲(chǔ)IP而不是字符串表示。
三、避免使用NULL字段。原因NULL字段查詢優(yōu)化難,含NULL復(fù)合索引失效。
四、少用或拆分TEXT/BLOB字段。字段太大需要更多的空間,性能低下,如需使用拆分到單獨(dú)表。
五、不要在表字段中存儲(chǔ)圖片。
索引使用注意事項(xiàng)
一、合理添加索引。索引添加太多會(huì)影響更新速度。能夠使用復(fù)合索引的避免加多個(gè)單獨(dú)索引。
二、字符字段建立前綴索引。
三、不在索引列做運(yùn)算。索引列做運(yùn)算會(huì)導(dǎo)致索引失效。
四、盡量不使用外建。
SQL類(lèi)注意事項(xiàng)
一、 SQL語(yǔ)句盡可能簡(jiǎn)單。大SQL拆分成多個(gè)小SQL。
二、事務(wù)編寫(xiě)盡量短小。事務(wù)即開(kāi)即用用完立即關(guān)閉。
三、盡量不要使用select *。只取需要的列。
四、改寫(xiě)OR為IN或者改寫(xiě)為UNION操作。OR在數(shù)據(jù)量大的時(shí)候性能低于IN。
五、避免NOT、!=、、NOT IN、NOT EXISTS、NOT LIKE等查詢。
六、避免%前綴模糊查詢。
七、能用UNION ALL不要用UNION。
八、GROUP BY中去除排序。自帶排序。
九、同類(lèi)型的字段做比較。字符類(lèi)和字符類(lèi)比較,數(shù)值類(lèi)和數(shù)值類(lèi)比較,不要混在一起比較。
十、盡量單表查詢,盡量不要多表關(guān)聯(lián)查詢。多表關(guān)聯(lián)查詢可以拆分成單表查詢?cè)趹?yīng)用程序中聚合數(shù)據(jù)。
十一、復(fù)合索引的多列注意最左原則。
上述注意事項(xiàng)能避免很多性能低下的SQL,希望在開(kāi)發(fā)過(guò)程中能引起注意。