mysql怎么測試性能 如何測試mysql性能

mysql數(shù)據(jù)庫性能測試

我理解的是你希望了解mysql性能測試的方法:

成都創(chuàng)新互聯(lián)公司總部坐落于成都市區(qū),致力網(wǎng)站建設服務有成都網(wǎng)站制作、網(wǎng)站設計、網(wǎng)絡營銷策劃、網(wǎng)頁設計、網(wǎng)站維護、公眾號搭建、小程序設計、軟件開發(fā)等為企業(yè)提供一整套的信息化建設解決方案。創(chuàng)造真正意義上的網(wǎng)站建設,為互聯(lián)網(wǎng)品牌在互動行銷領域創(chuàng)造價值而不懈努力!

其實常用的一般:

選取最適用的字段屬性

MySQL可以很好的支持大數(shù)據(jù)量的存取,但是一般說來,數(shù)據(jù)庫中的表越小,在它上面執(zhí)行的查詢也就會越快。因此,在創(chuàng)建表的時候,為了獲得更好的性能,我們可以將表中字段的寬度設得盡可能小。例如,在定義郵政編碼這個字段時,如果將其設置為CHAR(255),顯然給數(shù)據(jù)庫增加了不必要的空間,甚至使用VARCHAR這種類型也是多余的,因為CHAR(6)就可以很好的完成任務了。同樣的,如果可以的話,我們應該使用MEDIUMINT而不是BIGIN來定義整型字段。

另外一個提高效率的方法是在可能的情況下,應該盡量把字段設置為NOT NULL,這樣在將來執(zhí)行查詢的時候,數(shù)據(jù)庫不用去比較NULL值。

對于某些文本字段,例如“省份”或者“性別”,我們可以將它們定義為ENUM類型。因為在MySQL中,ENUM類型被當作數(shù)值型數(shù)據(jù)來處理,而數(shù)值型數(shù)據(jù)被處理起來的速度要比文本類型快得多。這樣,我們又可以提高數(shù)據(jù)庫的性能。

2、使用連接(JOIN)來代替子查詢(Sub-Queries)

MySQL從4.1開始支持SQL的子查詢。這個技術可以使用SELECT語句來創(chuàng)建一個單列的查詢結果,然后把這個結果作為過濾條件用在另一個查詢中。例如,我們要將客戶基本信息表中沒有任何訂單的客戶刪除掉,就可以利用子查詢先從銷售信息表中將所有發(fā)出訂單的客戶ID取出來,然后將結果傳遞給主查詢,如下所示:

DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死,并且寫起來也很容易。但是,有些情況下,子查詢可以被更有效率的連接(JOIN).. 替代。例如,假設我們要將所有沒有訂單記錄的用戶取出來,可以用下面這個查詢完成:

SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

如果使用連接(JOIN).. 來完成這個查詢工作,速度將會快很多。尤其是當salesinfo表中對CustomerID建有索引的話,性能將會更好,查詢?nèi)缦拢?/p>

SELECT * FROM customerinfo LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. CustomerID WHERE salesinfo.CustomerID IS NULL

連接(JOIN).. 之所以更有效率一些,是因為 MySQL不需要在內(nèi)存中創(chuàng)建臨時表來完成這個邏輯上的需要兩個步驟的查詢工作。

3、使用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表

MySQL 從 4.0 的版本開始支持 UNION 查詢,它可以把需要使用臨時表的兩條或更多的 SELECT 查詢合并的一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證數(shù)據(jù)庫整齊、高效。使用 UNION 來創(chuàng)建查詢的時候,我們只需要用 UNION作為關鍵字把多個 SELECT 語句連接起來就可以了,要注意的是所有 SELECT 語句中的字段數(shù)目要想同。下面的例子就演示了一個使用 UNION的查詢。

SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author

UNION

SELECT Name, Supplier FROM product

4、事務

盡管我們可以使用子查詢(Sub-Queries)、連接(JOIN)和聯(lián)合(UNION)來創(chuàng)建各種各樣的查詢,但不是所有的數(shù)據(jù)庫操作都可以只用一條或少數(shù)幾條SQL語句就可以完成的。更多的時候是需要用到一系列的語句來完成某種工作。但是在這種情況下,當這個語句塊中的某一條語句運行出錯的時候,整個語句塊的操作就會變得不確定起來。設想一下,要把某個數(shù)據(jù)同時插入兩個相關聯(lián)的表中,可能會出現(xiàn)這樣的情況:第一個表中成功更新后,數(shù)據(jù)庫突然出現(xiàn)意外狀況,造成第二個表中的操作沒有完成,這樣,就會造成數(shù)據(jù)的不完整,甚至會破壞數(shù)據(jù)庫中的數(shù)據(jù)。要避免這種情況,就應該使用事務,它的作用是:要么語句塊中每條語句都操作成功,要么都失敗。換句話說,就是可以保持數(shù)據(jù)庫中數(shù)據(jù)的一致性和完整性。事物以BEGIN 關鍵字開始,COMMIT關鍵字結束。在這之間的一條SQL操作失敗,那么,ROLLBACK命令就可以把數(shù)據(jù)庫恢復到BEGIN開始之前的狀態(tài)。

BEGIN;

INSERT INTO salesinfo SET CustomerID=14;

UPDATE inventory SET Quantity=11

WHERE item='book';

COMMIT;

事務的另一個重要作用是當多個用戶同時使用相同的數(shù)據(jù)源時,它可以利用鎖定數(shù)據(jù)庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所干擾。

5、鎖定表

盡管事務是維護數(shù)據(jù)庫完整性的一個非常好的方法,但卻因為它的獨占性,有時會影響數(shù)據(jù)庫的性能,尤其是在很大的應用系統(tǒng)中。由于在事務執(zhí)行的過程中,數(shù)據(jù)庫將會被鎖定,因此其它的用戶請求只能暫時等待直到該事務結束。如果一個數(shù)據(jù)庫系統(tǒng)只有少數(shù)幾個用戶

來使用,事務造成的影響不會成為一個太大的問題;但假設有成千上萬的用戶同時訪問一個數(shù)據(jù)庫系統(tǒng),例如訪問一個電子商務網(wǎng)站,就會產(chǎn)生比較嚴重的響應延遲。

其實,有些情況下我們可以通過鎖定表的方法來獲得更好的性能。下面的例子就用鎖定表的方法來完成前面一個例子中事務的功能。

LOCK TABLE inventory WRITE

SELECT Quantity FROM inventory

WHEREItem='book';

...

UPDATE inventory SET Quantity=11

WHEREItem='book';

UNLOCK TABLES

這里,我們用一個 SELECT 語句取出初始數(shù)據(jù),通過一些計算,用 UPDATE 語句將新值更新到表中。包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執(zhí)行之前,不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作。

6、使用外鍵

鎖定表的方法可以維護數(shù)據(jù)的完整性,但是它卻不能保證數(shù)據(jù)的關聯(lián)性。這個時候我們就可以使用外鍵。例如,外鍵可以保證每一條銷售記錄都指向某一個存在的客戶。在這里,外鍵可以把customerinfo 表中的CustomerID映射到salesinfo表中CustomerID,任何一條沒有合法CustomerID的記錄都不會被更新或插入到salesinfo中。

CREATE TABLE customerinfo

(

CustomerID INT NOT NULL ,

PRIMARY KEY ( CustomerID )

) TYPE = INNODB;

CREATE TABLE salesinfo

(

SalesID INT NOT NULL,

CustomerID INT NOT NULL,

PRIMARY KEY(CustomerID, SalesID),

FOREIGN KEY (CustomerID) REFERENCES customerinfo

(CustomerID) ON DELETECASCADE

) TYPE = INNODB;

注意例子中的參數(shù)“ON DELETE CASCADE”。該參數(shù)保證當 customerinfo 表中的一條客戶記錄被刪除的時候,salesinfo 表中所有與該客戶相關的記錄也會被自動刪除。如果要在 MySQL 中使用外鍵,一定要記住在創(chuàng)建表的時候?qū)⒈淼念愋投x為事務安全表 InnoDB類型。該類型不是 MySQL 表的默認類型。定義的方法是在 CREATE TABLE 語句中加上 TYPE=INNODB。如例中所示。

7、使用索引

索引是提高數(shù)據(jù)庫性能的常用方法,它可以令數(shù)據(jù)庫服務器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含有MAX(), MIN()和ORDERBY這些命令的時候,性能提高更為明顯。那該對哪些字段建立索引呢?一般說來,索引應建立在那些將用于JOIN, WHERE判斷和ORDER BY排序的字段上。盡量不要對數(shù)據(jù)庫中某個含有大量重復的值的字段建立索引。對于一個ENUM類型的字段來說,出現(xiàn)大量重復值是很有可能的情況,例如customerinfo中的“province”.. 字段,在這樣的字段上建立索引將不會有什么幫助;相反,還有可能降低數(shù)據(jù)庫的性能。我們在創(chuàng)建表的時候可以同時創(chuàng)建合適的索引,也可以使用ALTER TABLE或CREATE INDEX在以后創(chuàng)建索引。此外,MySQL

從版本3.23.23開始支持全文索引和搜索。全文索引在MySQL 中是一個FULLTEXT類型索引,但僅能用于MyISAM 類型的表。對于一個大的數(shù)據(jù)庫,將數(shù)據(jù)裝載到一個沒有FULLTEXT索引的表中,然后再使用ALTER TABLE或CREATE INDEX創(chuàng)建索引,將是非??斓?。但如果將數(shù)據(jù)裝載到一個已經(jīng)有FULLTEXT索引的表中,執(zhí)行過程將會非常慢。

8、優(yōu)化的查詢語句

絕大多數(shù)情況下,使用索引可以提高查詢的速度,但如果SQL語句使用不恰當?shù)脑?,索引將無法發(fā)揮它應有的作用。下面是應該注意的幾個方面。首先,最好是在相同類型的字段間進行比較的操作。在MySQL 3.23版之前,這甚至是一個必須的條件。例如不能將一個建有索引的INT字段和BIGINT字段進行比較;但是作為特殊的情況,在CHAR類型的字段和VARCHAR類型字段的字段大小相同的時候,可以將它們進行比較。其次,在建有索引的字段上盡量不要使用函數(shù)進行操作。

例如,在一個DATE類型的字段上使用YEAE()函數(shù)時,將會使索引不能發(fā)揮應有的作用。所以,下面的兩個查詢雖然返回的結果一樣,但后者要比前者快得多。

SELECT * FROM order WHERE YEAR(OrderDate)2001;

SELECT * FROM order WHERE OrderDate"2001-01-01";

同樣的情形也會發(fā)生在對數(shù)值型字段進行計算的時候:

SELECT * FROM inventory WHERE Amount/724;

SELECT * FROM inventory WHERE Amount24*7;

上面的兩個查詢也是返回相同的結果,但后面的查詢將比前面的一個快很多。第三,在搜索字符型字段時,我們有時會使用 LIKE 關鍵字和通配符,這種做法雖然簡單,但卻也是以犧牲系統(tǒng)性能為代價的。例如下面的查詢將會比較表中的每一條記錄。

SELECT * FROM books

WHERE name like "MySQL%"

但是如果換用下面的查詢,返回的結果一樣,但速度就要快上很多:

SELECT * FROM books

WHERE name="MySQL"and name"MySQM"

最后,應該注意避免在查詢中讓MySQL進行自動類型轉(zhuǎn)換,因為轉(zhuǎn)換過程也會使索引變得不起作用。

Go語言使用gorm對MySQL進行性能測試

之前寫過了Go語言gorm框架MySQL實踐,其中對gorm框架在操作MySQL的各種基礎實踐,下面分享一下如何使用gorm框架對MySQL直接進行性能測試的簡單實踐。

這里我使用了一個原始的Go語言版本的 FunTester 測試框架,現(xiàn)在只有一個基本的方法,實在是因為Go語言特性太強了。框架設計的主要思路之一就是利用Go語言的閉包和方法參數(shù)特性,將一個 func() 當做性能測試的主題,通過不斷運行這個 func() 來實現(xiàn)性能測試。當然還有另外一個思路就是運行一個多線程任務類,類似 Java 版本的 com.funtester.base.constaint.ThreadBase 抽象類,這樣可以設置一些類的屬性,綁定一些測試資源,適配更多的測試場景。

下面演示select的性能測試,這里我用了隨機ID查詢的場景。

這里我使用從35開始遞增的ID進行刪除。

這里使用了select的用例部分,隨機ID,然后更新name字段,隨機10個長度的字符串。

這里用到了 FunTester 字段都是隨機生成。

到這里可以看出,性能測試框架用到的都是gorm框架的基礎API使用,這里MySQL連接池的管理工作完全交給了gorm框架完成,看資料說非常牛逼,我們只需要設置幾個參數(shù)。這個使用體現(xiàn)很像 HttpClient 設置 HTTP 連接池類似,這里我們也可以看出這些優(yōu)秀的框架使用起來都是非常簡單的。

PS:關于gorm的基礎使用的請參考上一期的文章Go語言gorm框架MySQL實踐。

(16)mysql瓶頸 & MGR和一致性讀 性能測試

容量: 看硬件

InnoDB?最大容量64TB ,存儲引擎將 InnoDB 表 保存在一個 表空間內(nèi)( 原始磁盤分區(qū),由數(shù)個文件創(chuàng)建)。這樣, 表大小 能超過 單獨文件最大容量 。

MySQL 3.22( MyISAM )限制表大小 4GB ,最大表尺寸增加到65536TB(2567 – 1字節(jié))。最大有效表尺寸通常是由 操作系統(tǒng) 對 文件大小限制 決定的, 不是 由MySQL內(nèi)部限制決定。

最多 20億個表 ,一個表允許定義1024列,每行的最大長度為8092字節(jié)(不包括文本和圖像類型的長度);

阿里《Java 開發(fā)手冊》提出 單表行 500w 容量2GB ,才分庫分表

與 MySQL 配置及硬件 有關,實際記錄的條數(shù)無關。因為表 索引 裝載 到內(nèi)存,InnoDB buffer size 足夠 ,才能全加載進內(nèi)存,查沒問題。達量級限時,導致 內(nèi)存無法存儲索引 ,產(chǎn)生磁盤 IO,性能下降。增加硬件配置解決。500w算折中

QPS在8400左右 :400個線程并發(fā),插入100萬條記錄(4核2.33G、3G內(nèi)存、SATA硬盤)

寫: 90-100M/S(機械硬盤,7200轉(zhuǎn))預計kB_wrtn/s在90M左右

show variables like 'max_connections' ?mysql當前最大連接數(shù)

set global max_connections=1000; ?設置當前最大連接數(shù)為1000;mysql重啟時失效,需要長期生效在my.ini 添加 max_connections=1000

從業(yè)務使用場景出發(fā),根據(jù)RDS套餐類型和線上實際訪問流量,來衡量性能指標,以便方便對標實際業(yè)務場景。

MySQL 5.7.21 Group Replication

MySQL 5.7.21 Group Replication with Consistent Read

同機房3節(jié)點、跨機房3節(jié)點

網(wǎng)絡異常:長時間延時0.5ms,長時間延時2ms,丟包0.01%

場景1、2的差異可以衡量 跨機房網(wǎng)絡 帶來的 性能損耗

場景3關注在 網(wǎng)絡質(zhì)量變化 時帶來的 性能變化

同機房3節(jié)點為 05 06 03????跨機房3節(jié)點為 05 06 01

機器部署:同IDC3臺(永順ys 03 05 06),跨IDC1臺(廣州gz 01)

同IDC RTT(06-05):RTT min/avg/max/mdev =?0.051/0.059/0.070/0.010?ms

跨IDC RTT(01-05):RTT min/avg/max/mdev =?0.739/0.749/0.810/0.027

跨IDC的網(wǎng)絡耗時是同 IDC的1.3倍 ,在設置 延遲0.5ms后 的網(wǎng)絡質(zhì)量:

同IDC RTT(06-05):RTT min/avg/max/mdev =?0.507/0.564/0.617/0.037

跨IDC RTT(01-05):RTT min/avg/max/mdev =?1.199/1.248/1.315/0.046

跨IDC的網(wǎng)絡耗時是 同IDC的2.2倍 ,在設置 延遲2ms后 的網(wǎng)絡質(zhì)量:

同IDC RTT(06-05):RTT min/avg/max/mdev = 1.963/2.054/2.161/0.064 ms

跨IDC RTT(01-05):RTT?min/avg/max/mdev = 2.642/2.732/2.835/0.076 ms

參考:;aliyun

幾個常用的MySQL性能測試工具

1、mysqlslap

安裝:簡單,裝了mysql就有了

作用:模擬并發(fā)測試數(shù)據(jù)庫性能。

優(yōu)點:簡單,容易使用。

不足:不能指定生成的數(shù)據(jù)規(guī)模,測試過程不清楚針對十萬級還是百萬級數(shù)據(jù)做的測試,感覺不太適合做綜合測試,比較適合針對既有數(shù)據(jù)庫,對單個sql進行優(yōu)化的測試。

使用方法:

可以使用mysqlslap --help來顯示使用方法:

Default options are read from the following files in the given order:

/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

--concurrency代表并發(fā)數(shù)量,多個可以用逗號隔開,concurrency=10,50,100, 并發(fā)連接線程數(shù)分別是10、50、100個并發(fā)。

--engines代表要測試的引擎,可以有多個,用分隔符隔開。

--iterations代表要運行這些測試多少次。

--auto-generate-sql 代表用系統(tǒng)自己生成的SQL腳本來測試。

--auto-generate-sql-load-type 代表要測試的是讀還是寫還是兩者混合的(read,write,update,mixed)

--number-of-queries 代表總共要運行多少次查詢。每個客戶運行的查詢數(shù)量可以用查詢總數(shù)/并發(fā)數(shù)來計算。

--debug-info 代表要額外輸出CPU以及內(nèi)存的相關信息。

--number-int-cols :創(chuàng)建測試表的 int 型字段數(shù)量

--auto-generate-sql-add-autoincrement : 代表對生成的表自動添加auto_increment列,從5.1.18版本開始

--number-char-cols 創(chuàng)建測試表的 char 型字段數(shù)量。

--create-schema 測試的schema,MySQL中schema也就是database。

--query 使用自定義腳本執(zhí)行測試,例如可以調(diào)用自定義的一個存儲過程或者sql語句來執(zhí)行測試。

--only-print 如果只想打印看看SQL語句是什么,可以用這個選項。

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ù)庫和sql語句:

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個客戶端同時運行要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

安裝時候可能會報錯,后來baidu發(fā)現(xiàn)個好文 怕以后找不到,也貼過來吧

1.如果mysql不是默認路徑安裝,那么需要通過指定--with-mysql-includes和--with-mysql-libs參數(shù)來加載mysql安裝路徑

2.如果報錯:

../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.如果報錯:

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時,報如下錯誤:

./autogen.sh: line 3: aclocal: command not found

那么需要安裝一個軟件:

yum install automake

然后需要增加一個參數(shù):查找: AC_PROG_LIBTOOL 將其注釋,然后增加AC_PROG_RANLIB

作用:模擬并發(fā),可以執(zhí)行CPU/內(nèi)存/線程/IO/數(shù)據(jù)庫等方面的性能測試。數(shù)據(jù)庫目前支持MySQL/Oracle/PostgreSQL

優(yōu)點:可以指定測試數(shù)據(jù)的規(guī)模,可以單獨測試讀、寫的性能,也可以測試讀寫混合的性能。

不足:測試的時候,由于網(wǎng)絡原因,測試的非常慢,但是最終給的結果卻很好,并發(fā)支持很高,所以給我的感覺是并不太準確。當然也可能我沒搞明白原理

使用方法:

準備數(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í)行測試

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)站上下載源碼比較麻煩,需要工具、注冊、生成證書等。這里提供一個下載包

export C_INCLUDE_PATH=/usr/include/mysql

export PATH=/usr/bin:$PATH

export LD_LIBRARY_PATH=/usr/lib/mysql

cd /tmp/tpcc/src

make

然后就會在 /tmp/tpcc-mysql 下生成 tpcc 命令行工具 tpcc_load 、 tpcc_start

作用:測試mysql數(shù)據(jù)庫的整體性能

優(yōu)點:符合tpcc標準,有標準的方法,模擬真實的交易活動,結果比較可靠。

不足:不能單獨測試讀或者寫的性能,對于一些以查詢?yōu)橹骰蛘咧粚懙膽茫蜎]有這么大的意義了。

使用方法:

加載數(shù)據(jù)

創(chuàng)建庫

mysqlcreate database tpcc10;

創(chuàng)建表:

shellmysql tpcc10 create_table.sql

添加外鍵:

shellmysql tpcc10 add_fkey_idx.sql

加載數(shù)據(jù):

1、單進程加載:

shell./tpcc_load 192.168.11.172 tpcc10 root pwd 300

|主機||數(shù)據(jù)庫||用戶||密碼||warehouse|

2、并發(fā)加載:(推薦,但需要修改一下)

shell./load.sh tpcc300 300

|數(shù)據(jù)庫||warehouse|

3、測試

./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.

高性能MySQL:測試何種指標

測試何種指標

在開始執(zhí)行甚至是在設計基準測試之前 需要先明確測試的目標 測試目標決定了選擇什么樣的測試工具和技術 以獲得精確而有意義的測試結果 可以將測試目標細化為一系列的問題 比如 這種CPU 是否比另外一種要快? 或 新索引是否比當前索引性能更好?

有時候需要用不同的方法測試不同的指標 比如 針對延遲(latency)和吞吐量(throughput)就需要采用不同的測試方法

請考慮以下指標 看看如何滿足測試的需求

吞吐量

吞吐量指的是單位時間內(nèi)的事務處理數(shù) 這一直是經(jīng)典的數(shù)據(jù)庫應用測試指標 一些標準的基準測試被廣泛地引用 如TPC C(參考// tpc ) 而且很多數(shù)據(jù)庫廠商都努力爭取在這些測試中取得好成績 這類基準測試主要針對在線事務處理(OLTP)的吞吐量 非常適用于多用戶的交互式應用 常用的測試單位是每秒事務數(shù)(TPS) 有些也采用每分鐘事務數(shù)(TPM)

響應時間或者延遲

這個指標用于測試任務所需的整體時間 根據(jù)具體的應用 測試的時間單位可能是微秒 毫秒 秒或者分鐘 根據(jù)不同的時間單位可以計算出平均響應時間 最小響應時間 最大響應時間和所占百分比 最大響應時間通常意義不大 因為測試時間越長 最大響應時間也可能越大 而且其結果通常不可重復 每次測試都可能得到不同的最大響應時間 因此 通??梢允褂冒俜直软憫獣r間(percentile responsetime)來替代最大響應時間 例如 如果 % 的響應時間都是 毫秒 則表示任務在 % 的時間段內(nèi)都可以在 毫秒之內(nèi)完成

使用圖表有助于理解測試結果 可以將測試結果繪制成折線圖(比如平均值折線或者 % 百分比折線)或者散點圖 直觀地表現(xiàn)數(shù)據(jù)結果集的分布情況 通過這些圖可以發(fā)現(xiàn)長時間測試的趨勢 本章后面將更詳細地討論這一點

并發(fā)性

并發(fā)性是一個非常重要又經(jīng)常被誤解和誤用的指標 例如 它經(jīng)常被表示成多少用戶在同一時間瀏覽一個Web 站點 經(jīng)常使用的指標是有多少個會話注 然而 HTTP協(xié)議是無狀態(tài)的 大多數(shù)用戶只是簡單地讀取瀏覽器上顯示的信息 這并不等同于Web 服務器的并發(fā)性 而且 Web 服務器的并發(fā)性也不等同于數(shù)據(jù)庫的并發(fā)性 而僅僅只表示會話存儲機制可以處理多少數(shù)據(jù)的能力 Web 服務器的并發(fā)性更準確的度量指標 應該是在任意時間有多少同時發(fā)生的并發(fā)請求

在應用的不同環(huán)節(jié)都可以測量相應的并發(fā)性 Web 服務器的高并發(fā) 一般也會導致數(shù)據(jù)庫的高并發(fā) 但服務器采用的語言和工具集對此都會有影響 注意不要將創(chuàng)建數(shù)據(jù)庫連接和并發(fā)性搞混淆 一個設計良好的應用 同時可以打開成百上千個MySQL 數(shù)據(jù)庫服務器連接 但可能同時只有少數(shù)連接在執(zhí)行查詢 所以說 一個Web 站點 同時有 個用戶 訪問 卻可能只有 ~ 個并發(fā)請求到MySQL 數(shù)據(jù)庫

換句話說 并發(fā)性基準測試需要關注的是正在工作中的并發(fā)操作 或者是同時工作中的線程數(shù)或者連接數(shù) 當并發(fā)性增加時 需要測量吞吐量是否下降 響應時間是否變長 如果是這樣 應用可能就無法處理峰值壓力

并發(fā)性的測量完全不同于響應時間和吞吐量 它不像是一個結果 而更像是設置基準測試的一種屬性 并發(fā)性測試通常不是為了測試應用能達到的并發(fā)度 而是為了測試應用在不同并發(fā)下的性能 當然 數(shù)據(jù)庫的并發(fā)性還是需要測量的 可以通過sy *** ench 指定 或者 個線程的測試 然后在測試期間記錄MySQL 數(shù)據(jù)庫的Threads_running 狀態(tài)值 在第 章將討論這個指標對容量規(guī)劃的影響

可擴展性

在系統(tǒng)的業(yè)務壓力可能發(fā)生變化的情況下 測試可擴展性就非常必要了 第 章將更進一步討論可擴展性的話題 簡單地說 可擴展性指的是 給系統(tǒng)增加一倍的工作 在理想情況下就能獲得兩倍的結果(即吞吐量增加一倍) 或者說 給系統(tǒng)增加一倍的資源(比如兩倍的CPU 數(shù)) 就可以獲得兩倍的吞吐量 當然 同時性能(響應時間)也必須在可以接受的范圍內(nèi) 大多數(shù)系統(tǒng)是無法做到如此理想的線性擴展的 隨著壓力的變化 吞吐量和性能都可能越來越差

可擴展性指標對于容量規(guī)范非常有用 它可以提供其他測試無法提供的信息 來幫助發(fā)現(xiàn)應用的瓶頸 比如 如果系統(tǒng)是基于單個用戶的響應時間測試(這是一個很糟糕的測試策略)設計的 雖然測試的結果很好 但當并發(fā)度增加時 系統(tǒng)的性能有可能變得非常糟糕 而一個基于不斷增加用戶連接的情況下的響應時間測試則可以發(fā)現(xiàn)這個問題

一些任務 比如從細粒度數(shù)據(jù)創(chuàng)建匯總表的批量工作 需要的是周期性的快速響應時間 當然也可以測試這些任務純粹的響應時間 但要注意考慮這些任務之間的相互影響 批量工作可能導致相互之間有影響的查詢性能變差 反之亦然

歸根結底 應該測試那些對用戶來說最重要的指標 因此應該盡可能地去收集一些需求 比如 什么樣的響應時間是可以接受的 期待多少的并發(fā)性 等等 然后基于這些需求來設計基準測試 避免目光短淺地只關注部分指標 而忽略其他指標

返回目錄 高性能MySQL

編輯推薦

ASP NET開發(fā)培訓視頻教程

數(shù)據(jù)倉庫與數(shù)據(jù)挖掘培訓視頻教程

lishixinzhi/Article/program/MySQL/201311/29741

分享名稱:mysql怎么測試性能 如何測試mysql性能
新聞來源:http://muchs.cn/article44/doocoee.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、建站公司微信公眾號、虛擬主機、響應式網(wǎng)站小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設