我理解的是你希望了解mysql性能測試的方法:
成都創(chuàng)新互聯(lián)公司總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)站維護(hù)、公眾號搭建、小程序設(shè)計(jì)、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動(dòng)行銷領(lǐng)域創(chuàng)造價(jià)值而不懈努力!
其實(shí)常用的一般:
選取最適用的字段屬性
MySQL可以很好的支持大數(shù)據(jù)量的存取,但是一般說來,數(shù)據(jù)庫中的表越小,在它上面執(zhí)行的查詢也就會(huì)越快。因此,在創(chuàng)建表的時(shí)候,為了獲得更好的性能,我們可以將表中字段的寬度設(shè)得盡可能小。例如,在定義郵政編碼這個(gè)字段時(shí),如果將其設(shè)置為CHAR(255),顯然給數(shù)據(jù)庫增加了不必要的空間,甚至使用VARCHAR這種類型也是多余的,因?yàn)镃HAR(6)就可以很好的完成任務(wù)了。同樣的,如果可以的話,我們應(yīng)該使用MEDIUMINT而不是BIGIN來定義整型字段。
另外一個(gè)提高效率的方法是在可能的情況下,應(yīng)該盡量把字段設(shè)置為NOT NULL,這樣在將來執(zhí)行查詢的時(shí)候,數(shù)據(jù)庫不用去比較NULL值。
對于某些文本字段,例如“省份”或者“性別”,我們可以將它們定義為ENUM類型。因?yàn)樵贛ySQL中,ENUM類型被當(dāng)作數(shù)值型數(shù)據(jù)來處理,而數(shù)值型數(shù)據(jù)被處理起來的速度要比文本類型快得多。這樣,我們又可以提高數(shù)據(jù)庫的性能。
2、使用連接(JOIN)來代替子查詢(Sub-Queries)
MySQL從4.1開始支持SQL的子查詢。這個(gè)技術(shù)可以使用SELECT語句來創(chuàng)建一個(gè)單列的查詢結(jié)果,然后把這個(gè)結(jié)果作為過濾條件用在另一個(gè)查詢中。例如,我們要將客戶基本信息表中沒有任何訂單的客戶刪除掉,就可以利用子查詢先從銷售信息表中將所有發(fā)出訂單的客戶ID取出來,然后將結(jié)果傳遞給主查詢,如下所示:
DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
使用子查詢可以一次性的完成很多邏輯上需要多個(gè)步驟才能完成的SQL操作,同時(shí)也可以避免事務(wù)或者表鎖死,并且寫起來也很容易。但是,有些情況下,子查詢可以被更有效率的連接(JOIN).. 替代。例如,假設(shè)我們要將所有沒有訂單記錄的用戶取出來,可以用下面這個(gè)查詢完成:
SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
如果使用連接(JOIN).. 來完成這個(gè)查詢工作,速度將會(huì)快很多。尤其是當(dāng)salesinfo表中對CustomerID建有索引的話,性能將會(huì)更好,查詢?nèi)缦拢?/p>
SELECT * FROM customerinfo LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. CustomerID WHERE salesinfo.CustomerID IS NULL
連接(JOIN).. 之所以更有效率一些,是因?yàn)?MySQL不需要在內(nèi)存中創(chuàng)建臨時(shí)表來完成這個(gè)邏輯上的需要兩個(gè)步驟的查詢工作。
3、使用聯(lián)合(UNION)來代替手動(dòng)創(chuàng)建的臨時(shí)表
MySQL 從 4.0 的版本開始支持 UNION 查詢,它可以把需要使用臨時(shí)表的兩條或更多的 SELECT 查詢合并的一個(gè)查詢中。在客戶端的查詢會(huì)話結(jié)束的時(shí)候,臨時(shí)表會(huì)被自動(dòng)刪除,從而保證數(shù)據(jù)庫整齊、高效。使用 UNION 來創(chuàng)建查詢的時(shí)候,我們只需要用 UNION作為關(guān)鍵字把多個(gè) SELECT 語句連接起來就可以了,要注意的是所有 SELECT 語句中的字段數(shù)目要想同。下面的例子就演示了一個(gè)使用 UNION的查詢。
SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author
UNION
SELECT Name, Supplier FROM product
4、事務(wù)
盡管我們可以使用子查詢(Sub-Queries)、連接(JOIN)和聯(lián)合(UNION)來創(chuàng)建各種各樣的查詢,但不是所有的數(shù)據(jù)庫操作都可以只用一條或少數(shù)幾條SQL語句就可以完成的。更多的時(shí)候是需要用到一系列的語句來完成某種工作。但是在這種情況下,當(dāng)這個(gè)語句塊中的某一條語句運(yùn)行出錯(cuò)的時(shí)候,整個(gè)語句塊的操作就會(huì)變得不確定起來。設(shè)想一下,要把某個(gè)數(shù)據(jù)同時(shí)插入兩個(gè)相關(guān)聯(lián)的表中,可能會(huì)出現(xiàn)這樣的情況:第一個(gè)表中成功更新后,數(shù)據(jù)庫突然出現(xiàn)意外狀況,造成第二個(gè)表中的操作沒有完成,這樣,就會(huì)造成數(shù)據(jù)的不完整,甚至?xí)茐臄?shù)據(jù)庫中的數(shù)據(jù)。要避免這種情況,就應(yīng)該使用事務(wù),它的作用是:要么語句塊中每條語句都操作成功,要么都失敗。換句話說,就是可以保持?jǐn)?shù)據(jù)庫中數(shù)據(jù)的一致性和完整性。事物以BEGIN 關(guān)鍵字開始,COMMIT關(guān)鍵字結(jié)束。在這之間的一條SQL操作失敗,那么,ROLLBACK命令就可以把數(shù)據(jù)庫恢復(fù)到BEGIN開始之前的狀態(tài)。
BEGIN;
INSERT INTO salesinfo SET CustomerID=14;
UPDATE inventory SET Quantity=11
WHERE item='book';
COMMIT;
事務(wù)的另一個(gè)重要作用是當(dāng)多個(gè)用戶同時(shí)使用相同的數(shù)據(jù)源時(shí),它可以利用鎖定數(shù)據(jù)庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所干擾。
5、鎖定表
盡管事務(wù)是維護(hù)數(shù)據(jù)庫完整性的一個(gè)非常好的方法,但卻因?yàn)樗莫?dú)占性,有時(shí)會(huì)影響數(shù)據(jù)庫的性能,尤其是在很大的應(yīng)用系統(tǒng)中。由于在事務(wù)執(zhí)行的過程中,數(shù)據(jù)庫將會(huì)被鎖定,因此其它的用戶請求只能暫時(shí)等待直到該事務(wù)結(jié)束。如果一個(gè)數(shù)據(jù)庫系統(tǒng)只有少數(shù)幾個(gè)用戶
來使用,事務(wù)造成的影響不會(huì)成為一個(gè)太大的問題;但假設(shè)有成千上萬的用戶同時(shí)訪問一個(gè)數(shù)據(jù)庫系統(tǒng),例如訪問一個(gè)電子商務(wù)網(wǎng)站,就會(huì)產(chǎn)生比較嚴(yán)重的響應(yīng)延遲。
其實(shí),有些情況下我們可以通過鎖定表的方法來獲得更好的性能。下面的例子就用鎖定表的方法來完成前面一個(gè)例子中事務(wù)的功能。
LOCK TABLE inventory WRITE
SELECT Quantity FROM inventory
WHEREItem='book';
...
UPDATE inventory SET Quantity=11
WHEREItem='book';
UNLOCK TABLES
這里,我們用一個(gè) SELECT 語句取出初始數(shù)據(jù),通過一些計(jì)算,用 UPDATE 語句將新值更新到表中。包含有 WRITE 關(guān)鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執(zhí)行之前,不會(huì)有其它的訪問來對 inventory 進(jìn)行插入、更新或者刪除的操作。
6、使用外鍵
鎖定表的方法可以維護(hù)數(shù)據(jù)的完整性,但是它卻不能保證數(shù)據(jù)的關(guān)聯(lián)性。這個(gè)時(shí)候我們就可以使用外鍵。例如,外鍵可以保證每一條銷售記錄都指向某一個(gè)存在的客戶。在這里,外鍵可以把customerinfo 表中的CustomerID映射到salesinfo表中CustomerID,任何一條沒有合法CustomerID的記錄都不會(huì)被更新或插入到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ù)保證當(dāng) customerinfo 表中的一條客戶記錄被刪除的時(shí)候,salesinfo 表中所有與該客戶相關(guān)的記錄也會(huì)被自動(dòng)刪除。如果要在 MySQL 中使用外鍵,一定要記住在創(chuàng)建表的時(shí)候?qū)⒈淼念愋投x為事務(wù)安全表 InnoDB類型。該類型不是 MySQL 表的默認(rèn)類型。定義的方法是在 CREATE TABLE 語句中加上 TYPE=INNODB。如例中所示。
7、使用索引
索引是提高數(shù)據(jù)庫性能的常用方法,它可以令數(shù)據(jù)庫服務(wù)器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當(dāng)中包含有MAX(), MIN()和ORDERBY這些命令的時(shí)候,性能提高更為明顯。那該對哪些字段建立索引呢?一般說來,索引應(yīng)建立在那些將用于JOIN, WHERE判斷和ORDER BY排序的字段上。盡量不要對數(shù)據(jù)庫中某個(gè)含有大量重復(fù)的值的字段建立索引。對于一個(gè)ENUM類型的字段來說,出現(xiàn)大量重復(fù)值是很有可能的情況,例如customerinfo中的“province”.. 字段,在這樣的字段上建立索引將不會(huì)有什么幫助;相反,還有可能降低數(shù)據(jù)庫的性能。我們在創(chuàng)建表的時(shí)候可以同時(shí)創(chuàng)建合適的索引,也可以使用ALTER TABLE或CREATE INDEX在以后創(chuàng)建索引。此外,MySQL
從版本3.23.23開始支持全文索引和搜索。全文索引在MySQL 中是一個(gè)FULLTEXT類型索引,但僅能用于MyISAM 類型的表。對于一個(gè)大的數(shù)據(jù)庫,將數(shù)據(jù)裝載到一個(gè)沒有FULLTEXT索引的表中,然后再使用ALTER TABLE或CREATE INDEX創(chuàng)建索引,將是非??斓?。但如果將數(shù)據(jù)裝載到一個(gè)已經(jīng)有FULLTEXT索引的表中,執(zhí)行過程將會(huì)非常慢。
8、優(yōu)化的查詢語句
絕大多數(shù)情況下,使用索引可以提高查詢的速度,但如果SQL語句使用不恰當(dāng)?shù)脑?,索引將無法發(fā)揮它應(yīng)有的作用。下面是應(yīng)該注意的幾個(gè)方面。首先,最好是在相同類型的字段間進(jìn)行比較的操作。在MySQL 3.23版之前,這甚至是一個(gè)必須的條件。例如不能將一個(gè)建有索引的INT字段和BIGINT字段進(jìn)行比較;但是作為特殊的情況,在CHAR類型的字段和VARCHAR類型字段的字段大小相同的時(shí)候,可以將它們進(jìn)行比較。其次,在建有索引的字段上盡量不要使用函數(shù)進(jìn)行操作。
例如,在一個(gè)DATE類型的字段上使用YEAE()函數(shù)時(shí),將會(huì)使索引不能發(fā)揮應(yīng)有的作用。所以,下面的兩個(gè)查詢雖然返回的結(jié)果一樣,但后者要比前者快得多。
SELECT * FROM order WHERE YEAR(OrderDate)2001;
SELECT * FROM order WHERE OrderDate"2001-01-01";
同樣的情形也會(huì)發(fā)生在對數(shù)值型字段進(jìn)行計(jì)算的時(shí)候:
SELECT * FROM inventory WHERE Amount/724;
SELECT * FROM inventory WHERE Amount24*7;
上面的兩個(gè)查詢也是返回相同的結(jié)果,但后面的查詢將比前面的一個(gè)快很多。第三,在搜索字符型字段時(shí),我們有時(shí)會(huì)使用 LIKE 關(guān)鍵字和通配符,這種做法雖然簡單,但卻也是以犧牲系統(tǒng)性能為代價(jià)的。例如下面的查詢將會(huì)比較表中的每一條記錄。
SELECT * FROM books
WHERE name like "MySQL%"
但是如果換用下面的查詢,返回的結(jié)果一樣,但速度就要快上很多:
SELECT * FROM books
WHERE name="MySQL"and name"MySQM"
最后,應(yīng)該注意避免在查詢中讓MySQL進(jìn)行自動(dòng)類型轉(zhuǎn)換,因?yàn)檗D(zhuǎn)換過程也會(huì)使索引變得不起作用。
之前寫過了Go語言gorm框架MySQL實(shí)踐,其中對gorm框架在操作MySQL的各種基礎(chǔ)實(shí)踐,下面分享一下如何使用gorm框架對MySQL直接進(jìn)行性能測試的簡單實(shí)踐。
這里我使用了一個(gè)原始的Go語言版本的 FunTester 測試框架,現(xiàn)在只有一個(gè)基本的方法,實(shí)在是因?yàn)镚o語言特性太強(qiáng)了。框架設(shè)計(jì)的主要思路之一就是利用Go語言的閉包和方法參數(shù)特性,將一個(gè) func() 當(dāng)做性能測試的主題,通過不斷運(yùn)行這個(gè) func() 來實(shí)現(xiàn)性能測試。當(dāng)然還有另外一個(gè)思路就是運(yùn)行一個(gè)多線程任務(wù)類,類似 Java 版本的 com.funtester.base.constaint.ThreadBase 抽象類,這樣可以設(shè)置一些類的屬性,綁定一些測試資源,適配更多的測試場景。
下面演示select的性能測試,這里我用了隨機(jī)ID查詢的場景。
這里我使用從35開始遞增的ID進(jìn)行刪除。
這里使用了select的用例部分,隨機(jī)ID,然后更新name字段,隨機(jī)10個(gè)長度的字符串。
這里用到了 FunTester 字段都是隨機(jī)生成。
到這里可以看出,性能測試框架用到的都是gorm框架的基礎(chǔ)API使用,這里MySQL連接池的管理工作完全交給了gorm框架完成,看資料說非常牛逼,我們只需要設(shè)置幾個(gè)參數(shù)。這個(gè)使用體現(xiàn)很像 HttpClient 設(shè)置 HTTP 連接池類似,這里我們也可以看出這些優(yōu)秀的框架使用起來都是非常簡單的。
PS:關(guān)于gorm的基礎(chǔ)使用的請參考上一期的文章Go語言gorm框架MySQL實(shí)踐。
容量: 看硬件
InnoDB?最大容量64TB ,存儲(chǔ)引擎將 InnoDB 表 保存在一個(gè) 表空間內(nèi)( 原始磁盤分區(qū),由數(shù)個(gè)文件創(chuàng)建)。這樣, 表大小 能超過 單獨(dú)文件最大容量 。
MySQL 3.22( MyISAM )限制表大小 4GB ,最大表尺寸增加到65536TB(2567 – 1字節(jié))。最大有效表尺寸通常是由 操作系統(tǒng) 對 文件大小限制 決定的, 不是 由MySQL內(nèi)部限制決定。
最多 20億個(gè)表 ,一個(gè)表允許定義1024列,每行的最大長度為8092字節(jié)(不包括文本和圖像類型的長度);
阿里《Java 開發(fā)手冊》提出 單表行 500w 容量2GB ,才分庫分表
與 MySQL 配置及硬件 有關(guān),實(shí)際記錄的條數(shù)無關(guān)。因?yàn)楸?索引 裝載 到內(nèi)存,InnoDB buffer size 足夠 ,才能全加載進(jìn)內(nèi)存,查沒問題。達(dá)量級限時(shí),導(dǎo)致 內(nèi)存無法存儲(chǔ)索引 ,產(chǎn)生磁盤 IO,性能下降。增加硬件配置解決。500w算折中
QPS在8400左右 :400個(gè)線程并發(fā),插入100萬條記錄(4核2.33G、3G內(nèi)存、SATA硬盤)
寫: 90-100M/S(機(jī)械硬盤,7200轉(zhuǎn))預(yù)計(jì)kB_wrtn/s在90M左右
show variables like 'max_connections' ?mysql當(dāng)前最大連接數(shù)
set global max_connections=1000; ?設(shè)置當(dāng)前最大連接數(shù)為1000;mysql重啟時(shí)失效,需要長期生效在my.ini 添加 max_connections=1000
從業(yè)務(wù)使用場景出發(fā),根據(jù)RDS套餐類型和線上實(shí)際訪問流量,來衡量性能指標(biāo),以便方便對標(biāo)實(shí)際業(yè)務(wù)場景。
MySQL 5.7.21 Group Replication
MySQL 5.7.21 Group Replication with Consistent Read
同機(jī)房3節(jié)點(diǎn)、跨機(jī)房3節(jié)點(diǎn)
網(wǎng)絡(luò)異常:長時(shí)間延時(shí)0.5ms,長時(shí)間延時(shí)2ms,丟包0.01%
場景1、2的差異可以衡量 跨機(jī)房網(wǎng)絡(luò) 帶來的 性能損耗
場景3關(guān)注在 網(wǎng)絡(luò)質(zhì)量變化 時(shí)帶來的 性能變化
同機(jī)房3節(jié)點(diǎn)為 05 06 03????跨機(jī)房3節(jié)點(diǎn)為 05 06 01
機(jī)器部署:同IDC3臺(tái)(永順ys 03 05 06),跨IDC1臺(tái)(廣州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)絡(luò)耗時(shí)是同 IDC的1.3倍 ,在設(shè)置 延遲0.5ms后 的網(wǎng)絡(luò)質(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)絡(luò)耗時(shí)是 同IDC的2.2倍 ,在設(shè)置 延遲2ms后 的網(wǎng)絡(luò)質(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
1、mysqlslap
安裝:簡單,裝了mysql就有了
作用:模擬并發(fā)測試數(shù)據(jù)庫性能。
優(yōu)點(diǎn):簡單,容易使用。
不足:不能指定生成的數(shù)據(jù)規(guī)模,測試過程不清楚針對十萬級還是百萬級數(shù)據(jù)做的測試,感覺不太適合做綜合測試,比較適合針對既有數(shù)據(jù)庫,對單個(gè)sql進(jìn)行優(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ù)量,多個(gè)可以用逗號隔開,concurrency=10,50,100, 并發(fā)連接線程數(shù)分別是10、50、100個(gè)并發(fā)。
--engines代表要測試的引擎,可以有多個(gè),用分隔符隔開。
--iterations代表要運(yùn)行這些測試多少次。
--auto-generate-sql 代表用系統(tǒng)自己生成的SQL腳本來測試。
--auto-generate-sql-load-type 代表要測試的是讀還是寫還是兩者混合的(read,write,update,mixed)
--number-of-queries 代表總共要運(yùn)行多少次查詢。每個(gè)客戶運(yùn)行的查詢數(shù)量可以用查詢總數(shù)/并發(fā)數(shù)來計(jì)算。
--debug-info 代表要額外輸出CPU以及內(nèi)存的相關(guān)信息。
--number-int-cols :創(chuàng)建測試表的 int 型字段數(shù)量
--auto-generate-sql-add-autoincrement : 代表對生成的表自動(dòng)添加auto_increment列,從5.1.18版本開始
--number-char-cols 創(chuàng)建測試表的 char 型字段數(shù)量。
--create-schema 測試的schema,MySQL中schema也就是database。
--query 使用自定義腳本執(zhí)行測試,例如可以調(diào)用自定義的一個(gè)存儲(chǔ)過程或者sql語句來執(zhí)行測試。
--only-print 如果只想打印看看SQL語句是什么,可以用這個(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ù)庫和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個(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ò),后來baidu發(fā)現(xiàn)個(gè)好文 怕以后找不到,也貼過來吧
1.如果mysql不是默認(rèn)路徑安裝,那么需要通過指定--with-mysql-includes和--with-mysql-libs參數(shù)來加載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 將其注釋,然后增加AC_PROG_RANLIB
作用:模擬并發(fā),可以執(zhí)行CPU/內(nèi)存/線程/IO/數(shù)據(jù)庫等方面的性能測試。數(shù)據(jù)庫目前支持MySQL/Oracle/PostgreSQL
優(yōu)點(diǎn):可以指定測試數(shù)據(jù)的規(guī)模,可以單獨(dú)測試讀、寫的性能,也可以測試讀寫混合的性能。
不足:測試的時(shí)候,由于網(wǎng)絡(luò)原因,測試的非常慢,但是最終給的結(jié)果卻很好,并發(fā)支持很高,所以給我的感覺是并不太準(zhǔn)確。當(dāng)然也可能我沒搞明白原理
使用方法:
準(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í)行測試
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)站上下載源碼比較麻煩,需要工具、注冊、生成證書等。這里提供一個(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
作用:測試mysql數(shù)據(jù)庫的整體性能
優(yōu)點(diǎn):符合tpcc標(biāo)準(zhǔn),有標(biāo)準(zhǔn)的方法,模擬真實(shí)的交易活動(dòng),結(jié)果比較可靠。
不足:不能單獨(dú)測試讀或者寫的性能,對于一些以查詢?yōu)橹骰蛘咧粚懙膽?yīng)用,就沒有這么大的意義了。
使用方法:
加載數(shù)據(jù)
創(chuàng)建庫
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ù)庫||用戶||密碼||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.
測試何種指標(biāo)
在開始執(zhí)行甚至是在設(shè)計(jì)基準(zhǔn)測試之前 需要先明確測試的目標(biāo) 測試目標(biāo)決定了選擇什么樣的測試工具和技術(shù) 以獲得精確而有意義的測試結(jié)果 可以將測試目標(biāo)細(xì)化為一系列的問題 比如 這種CPU 是否比另外一種要快? 或 新索引是否比當(dāng)前索引性能更好?
有時(shí)候需要用不同的方法測試不同的指標(biāo) 比如 針對延遲(latency)和吞吐量(throughput)就需要采用不同的測試方法
請考慮以下指標(biāo) 看看如何滿足測試的需求
吞吐量
吞吐量指的是單位時(shí)間內(nèi)的事務(wù)處理數(shù) 這一直是經(jīng)典的數(shù)據(jù)庫應(yīng)用測試指標(biāo) 一些標(biāo)準(zhǔn)的基準(zhǔn)測試被廣泛地引用 如TPC C(參考// tpc ) 而且很多數(shù)據(jù)庫廠商都努力爭取在這些測試中取得好成績 這類基準(zhǔn)測試主要針對在線事務(wù)處理(OLTP)的吞吐量 非常適用于多用戶的交互式應(yīng)用 常用的測試單位是每秒事務(wù)數(shù)(TPS) 有些也采用每分鐘事務(wù)數(shù)(TPM)
響應(yīng)時(shí)間或者延遲
這個(gè)指標(biāo)用于測試任務(wù)所需的整體時(shí)間 根據(jù)具體的應(yīng)用 測試的時(shí)間單位可能是微秒 毫秒 秒或者分鐘 根據(jù)不同的時(shí)間單位可以計(jì)算出平均響應(yīng)時(shí)間 最小響應(yīng)時(shí)間 最大響應(yīng)時(shí)間和所占百分比 最大響應(yīng)時(shí)間通常意義不大 因?yàn)闇y試時(shí)間越長 最大響應(yīng)時(shí)間也可能越大 而且其結(jié)果通常不可重復(fù) 每次測試都可能得到不同的最大響應(yīng)時(shí)間 因此 通??梢允褂冒俜直软憫?yīng)時(shí)間(percentile responsetime)來替代最大響應(yīng)時(shí)間 例如 如果 % 的響應(yīng)時(shí)間都是 毫秒 則表示任務(wù)在 % 的時(shí)間段內(nèi)都可以在 毫秒之內(nèi)完成
使用圖表有助于理解測試結(jié)果 可以將測試結(jié)果繪制成折線圖(比如平均值折線或者 % 百分比折線)或者散點(diǎn)圖 直觀地表現(xiàn)數(shù)據(jù)結(jié)果集的分布情況 通過這些圖可以發(fā)現(xiàn)長時(shí)間測試的趨勢 本章后面將更詳細(xì)地討論這一點(diǎn)
并發(fā)性
并發(fā)性是一個(gè)非常重要又經(jīng)常被誤解和誤用的指標(biāo) 例如 它經(jīng)常被表示成多少用戶在同一時(shí)間瀏覽一個(gè)Web 站點(diǎn) 經(jīng)常使用的指標(biāo)是有多少個(gè)會(huì)話注 然而 HTTP協(xié)議是無狀態(tài)的 大多數(shù)用戶只是簡單地讀取瀏覽器上顯示的信息 這并不等同于Web 服務(wù)器的并發(fā)性 而且 Web 服務(wù)器的并發(fā)性也不等同于數(shù)據(jù)庫的并發(fā)性 而僅僅只表示會(huì)話存儲(chǔ)機(jī)制可以處理多少數(shù)據(jù)的能力 Web 服務(wù)器的并發(fā)性更準(zhǔn)確的度量指標(biāo) 應(yīng)該是在任意時(shí)間有多少同時(shí)發(fā)生的并發(fā)請求
在應(yīng)用的不同環(huán)節(jié)都可以測量相應(yīng)的并發(fā)性 Web 服務(wù)器的高并發(fā) 一般也會(huì)導(dǎo)致數(shù)據(jù)庫的高并發(fā) 但服務(wù)器采用的語言和工具集對此都會(huì)有影響 注意不要將創(chuàng)建數(shù)據(jù)庫連接和并發(fā)性搞混淆 一個(gè)設(shè)計(jì)良好的應(yīng)用 同時(shí)可以打開成百上千個(gè)MySQL 數(shù)據(jù)庫服務(wù)器連接 但可能同時(shí)只有少數(shù)連接在執(zhí)行查詢 所以說 一個(gè)Web 站點(diǎn) 同時(shí)有 個(gè)用戶 訪問 卻可能只有 ~ 個(gè)并發(fā)請求到MySQL 數(shù)據(jù)庫
換句話說 并發(fā)性基準(zhǔn)測試需要關(guān)注的是正在工作中的并發(fā)操作 或者是同時(shí)工作中的線程數(shù)或者連接數(shù) 當(dāng)并發(fā)性增加時(shí) 需要測量吞吐量是否下降 響應(yīng)時(shí)間是否變長 如果是這樣 應(yīng)用可能就無法處理峰值壓力
并發(fā)性的測量完全不同于響應(yīng)時(shí)間和吞吐量 它不像是一個(gè)結(jié)果 而更像是設(shè)置基準(zhǔn)測試的一種屬性 并發(fā)性測試通常不是為了測試應(yīng)用能達(dá)到的并發(fā)度 而是為了測試應(yīng)用在不同并發(fā)下的性能 當(dāng)然 數(shù)據(jù)庫的并發(fā)性還是需要測量的 可以通過sy *** ench 指定 或者 個(gè)線程的測試 然后在測試期間記錄MySQL 數(shù)據(jù)庫的Threads_running 狀態(tài)值 在第 章將討論這個(gè)指標(biāo)對容量規(guī)劃的影響
可擴(kuò)展性
在系統(tǒng)的業(yè)務(wù)壓力可能發(fā)生變化的情況下 測試可擴(kuò)展性就非常必要了 第 章將更進(jìn)一步討論可擴(kuò)展性的話題 簡單地說 可擴(kuò)展性指的是 給系統(tǒng)增加一倍的工作 在理想情況下就能獲得兩倍的結(jié)果(即吞吐量增加一倍) 或者說 給系統(tǒng)增加一倍的資源(比如兩倍的CPU 數(shù)) 就可以獲得兩倍的吞吐量 當(dāng)然 同時(shí)性能(響應(yīng)時(shí)間)也必須在可以接受的范圍內(nèi) 大多數(shù)系統(tǒng)是無法做到如此理想的線性擴(kuò)展的 隨著壓力的變化 吞吐量和性能都可能越來越差
可擴(kuò)展性指標(biāo)對于容量規(guī)范非常有用 它可以提供其他測試無法提供的信息 來幫助發(fā)現(xiàn)應(yīng)用的瓶頸 比如 如果系統(tǒng)是基于單個(gè)用戶的響應(yīng)時(shí)間測試(這是一個(gè)很糟糕的測試策略)設(shè)計(jì)的 雖然測試的結(jié)果很好 但當(dāng)并發(fā)度增加時(shí) 系統(tǒng)的性能有可能變得非常糟糕 而一個(gè)基于不斷增加用戶連接的情況下的響應(yīng)時(shí)間測試則可以發(fā)現(xiàn)這個(gè)問題
一些任務(wù) 比如從細(xì)粒度數(shù)據(jù)創(chuàng)建匯總表的批量工作 需要的是周期性的快速響應(yīng)時(shí)間 當(dāng)然也可以測試這些任務(wù)純粹的響應(yīng)時(shí)間 但要注意考慮這些任務(wù)之間的相互影響 批量工作可能導(dǎo)致相互之間有影響的查詢性能變差 反之亦然
歸根結(jié)底 應(yīng)該測試那些對用戶來說最重要的指標(biāo) 因此應(yīng)該盡可能地去收集一些需求 比如 什么樣的響應(yīng)時(shí)間是可以接受的 期待多少的并發(fā)性 等等 然后基于這些需求來設(shè)計(jì)基準(zhǔn)測試 避免目光短淺地只關(guān)注部分指標(biāo) 而忽略其他指標(biāo)
返回目錄 高性能MySQL
編輯推薦
ASP NET開發(fā)培訓(xùn)視頻教程
數(shù)據(jù)倉庫與數(shù)據(jù)挖掘培訓(xùn)視頻教程
lishixinzhi/Article/program/MySQL/201311/29741
分享名稱:mysql怎么測試性能 如何測試mysql性能
新聞來源:http://www.ekvhdxd.cn/article44/doocoee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、建站公司、微信公眾號、虛擬主機(jī)、響應(yīng)式網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)