
*****
## 什么是基準測試
基準測試是一種測量和評估軟件性能指標的活動用于建立某個時刻的性能基準,以便當系統發生軟硬件變化時重新進行基準測試以評估變化對性能的影響
<br>基準測試是針對系統設置的一種壓力測試
### 基準測試特點
直接、簡單、易于比較,用于評估服務器的處理能力
<br>可能不關心業務邏輯,所使用的查詢和業務的真實性可以和業務環境沒關系
### 壓力測試特點
- 對真實的業務數據進行測試,獲得真實系統所能承受的壓力
- 需要針對不同主題,所使用的數據和查詢也是真實用到的
- 基準測試是簡化了的壓力測試
## 基準測試的目的
* 建立MySQL服務器的性能基準線,確定當前MySQL服務器運行情況,確定優化之后的效果
* 模擬比當前系統更高的負載,已找出系統的擴展瓶頸,可以增加數據庫并發,觀察QPS(每秒處理的查詢數),TPS(每秒處理的事務數)變化,確定并發量與性能最優的關系
* 測試不同的硬件、軟件和操作系統配置
* 證明新的硬件設備是否配置正確
## 如何進行基準測試
### 對整個系統進行基準測試
#### 優點
* 能夠測試整個系統的性能,包括web服務器緩存、數據庫等
* MySQL并不總是出現性能問題的瓶頸,如果只關注MySQL可能忽略其他問題,能反映出系統中各個組件接口間的性能問題體現真實性能狀況
#### 缺點
基準測試最重要的就是簡單,可能對不同的方案進行測試,找到最優的方案,基準測試進行的時間一定要短,否則就要花費大量的時間進行基準測試
* 測試設計復雜,消耗時間長
### 對MySQL進行基準測試
#### 優點
* 測試設計簡單,所耗費時間短
#### 缺點
* 無法全面了解整個系統的性能基線
#### MySQL基準測試的常見指標
* 單位時間內處理的事務數(TPS)
* 單位時間內處理的查詢數(QPS)
### MySQL基準測試工具
#### MySQL基準測試之mysqlslap
* 可以模擬服務器負載,并輸出相關統計信息
#### 常用參數說明
* \--auto-generate-sql 由系統自動生成SQL腳本進行測試
* \--auto-generate-sql-add-autoincrement 在生成的表中增加自增ID
* \--auto-generate-sql-load-type 指定測試中使用的查詢類型 讀寫或者混合,默認是混合
* \--auto-generate-sql-write-number 指定初始化數據時生成的數據量
* \--concurrency 指定并發線程的數量 1,10,50,200
* \--engine 指定要測試表的存儲引擎,可以用逗號分割多個存儲引擎
* \--no-drop 指定不清理測試數據
* \--iterations 指定測試運行的次數 指定了這個不能指定no-drop
* \--number-of-queries 指定每一個線程執行的查詢數量
* \--debug-info 指定輸出額外的內存及CPU統計信息
* \--number-int-cols 指定測試表中包含的INT類型列的數量
* \--number-char-cols 指定測試表中包含的varchar類型的數量
* \--create-schema 指定了用于執行測試的數據庫的名字
* \--query 用于指定自定義SQL的腳本
* \--only-print 并不運行測試腳本,而是把生成的腳本打印出來
~~~
mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql --auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=test
~~~
sysbench測試工具:[https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html](https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html)
<table width="100%" class="table table-striped"><thead><tr><th></th><th>MyISAM</th><th>InnoDB</th></tr></thead><tbody><tr><td>存儲結構</td><td>每張表被存放在三個文件: <ol><li>frm-表格定義</li><li>MYD(MYData)-數據文件</li><li>MYI(MYIndex)-索引文件</li></ol></td><td>所有的表都保存在同一個數據文件中(也可能是多個文件,或者是獨立的表空間文件),InnoDB表的大小只受限于操作系統文件的大小,一般為2GB</td></tr><tr><td>存儲空間</td><td>MyISAM可被壓縮,存儲空間較小</td><td>InnoDB的表需要更多的內存和存儲,它會在主內存中建立其專用的緩沖池用于高速緩沖數據和索引</td></tr><tr><td>可移植性、備份及恢復</td><td>由于MyISAM的數據是以文件的形式存儲,所以在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操作</td><td>免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了</td></tr><tr><td>事務安全</td><td>不支持 每次查詢具有原子性</td><td>支持 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表</td></tr><tr><td>AUTO_INCREMENT</td><td>MyISAM表可以和其他字段一起建立聯合索引</td><td>InnoDB中必須包含只有該字段的索引</td></tr><tr><td>SELECT</td><td>MyISAM更優</td><td></td></tr><tr><td>INSERT</td><td></td><td>InnoDB更優</td></tr><tr><td>UPDATE</td><td></td><td>InnoDB更優</td></tr><tr><td>DELETE</td><td></td><td>InnoDB更優 它不會重新建立表,而是一行一行的刪除</td></tr><tr><td>COUNT without WHERE</td><td>MyISAM更優。因為MyISAM保存了表的具體行數</td><td>InnoDB沒有保存表的具體行數,需要逐行掃描統計,就很慢了</td></tr><tr><td>COUNT with WHERE</td><td>一樣</td><td>一樣,InnoDB也會鎖表</td></tr><tr><td>鎖</td><td>只支持表鎖</td><td>支持表鎖、行鎖 行鎖大幅度提高了多用戶并發操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的</td></tr><tr><td>外鍵</td><td>不支持</td><td>支持</td></tr><tr><td>FULLTEXT全文索引</td><td>支持</td><td>不支持 可以通過使用Sphinx從InnoDB中獲得全文索引,會慢一點</td></tr></tbody></table>
- 1-數據庫-基本使用
- 1-1-數據存儲
- 1-2-數據庫
- 1-3-MySQL安裝和配置
- 1-4-SQL
- 1-5-數據完整性
- 1-6-命令行操作數據庫
- 2-MySQL查詢
- 2-1-MySQL查詢
- 2-2-條件
- 2-3-聚合函數
- 2-4-分組
- 2-5-排序
- 2-6-分頁
- 2-7-連接查詢
- 2-8-子查詢
- 2-9-自關聯
- 3-MySQL外鍵
- 4-MySQL與Python交互
- 4-1-數據準備
- 4-2-數據表的拆分
- 4-3-Python操作MySQL
- 5-MySQL高級
- 5-1-視圖
- 5-2-事務
- 5-3-索引
- 5-4-賬戶管理(了解)
- 6-數據庫存儲引擎
- 6-1-MyISAM存儲引擎
- 6-2-Innodb存儲引擎
- 6-3-CSV存儲引擎
- 6-4-Memory存儲引
- 7-MySQL基準測試
- 8-explain分析SQL語句
- 8-1-影響服務器性能的幾個方面
- 8-2-explain分析SQL
- 9-索引優化案例
- 10-索引優化
- 11-排序優化
- 12-慢查詢日志
- 13-Show Profile進行SQL分析
- 14-數據庫鎖
- 15-主從復制
- 16-MySQL分區表
- 17-MySQL操作規范