mysql伺服器和配置優化
- 儲存層:儲存引擎、欄位型別選擇、正規化設計
- 設計層:索引、快取、分割槽(分表)
- 架構層:多個mysql伺服器設定,讀寫分離(主從模式)
- sql語句層:多個sql語句都可以達到目的的情況下,要選擇效能高、速度快的sql語句
儲存層
儲存引擎
- innodb儲存引擎:適合做修改、刪除,併發性高,行鎖,支援事務
- Myisam儲存引擎:適合做查詢、寫入
欄位型別選擇
- 佔據空間小、資料長度最好固定、資料內容最好為整型的
設計層
快取
如果該sql語句被頻繁執行獲得資料(這些資料還不經常發生變化),為了使得每次獲得的資訊速度較快,就可以把“執行結果”給快取起來,供後續的每次使用
分表
水平分表
單個表中資料太多,將單個資料庫表進行拆分,拆分成多個資料表,然後使用者訪問的時候,根據一定的演算法,讓使用者訪問不同的表,這樣資料分散到多個資料表中,減少了單個資料表的訪問壓力。提升了資料庫訪問效能。
垂直分表
舉例說明,在一個部落格系統中,文章標題,作者,分類,建立時間等,是變化頻率慢,查詢次數多,而且最好有很好的實時性的資料,我們把它叫做冷資料。而部落格的瀏覽量,回覆數等,類似的統計資訊,或者別的變化頻率比較高的資料,我們把它叫做活躍資料。
- 儲存引擎的使用不同,冷資料使用MyIsam 可以有更好的查詢資料。活躍資料,可以使用Innodb ,可以有更好的更新速度。
- 對冷資料進行更多的從庫配置,因為更多的操作是查詢,這樣來加快查詢速度。對熱資料,可以相對有更多的主庫的橫向分表處理。
- 對於一些特殊的活躍資料,也可以考慮使用memcache ,redis之類的快取,等累計到一定量再去更新資料庫.
伺服器調整優化
- 關閉不必要的二進位制日誌和慢查詢日誌,僅在記憶體足夠或開發除錯時開啟,慢查詢會消耗過度消耗CPU,可以間歇性開啟慢查詢日誌來定位新能瓶頸
- 因為生產環境中,資料庫大多都是讀操作,所以部署一主多從架構,主資料庫負責寫操作,並做雙擊熱備,多臺從資料庫做負載均衡,負責讀操作,主流的負載均衡器有LVS、HAProxy、Nginx。怎麼來實現讀寫分離呢?大多數企業是在程式碼層面實現讀寫分離,效率比較高
伺服器效能監控
super-smack:壓力測試工具
- 連線數
- QPS,Queries Per Second:每秒查詢數,一臺資料庫每秒能夠處理的查詢次數
- TPS,Transactions Per Second:每秒處理事務數
通過show status檢視執行狀態,會有300多條狀態資訊記錄,其中有幾個值幫可以我們計算出QPS和TPS,如下:
- Uptime:伺服器已經執行的實際,單位秒
- Questions:已經傳送給資料庫查詢數
- Com_select:查詢次數,實際運算元據庫的
- Com_insert:插入次數
- Com_delete:刪除次數
- Com_update:更新次數
- Com_commit:事務次數
- Com_rollback:回滾次數
那麼,計算方法來了,基於Questions計算出QPS:
mysql> show global status like ``'Questions'``;
mysql> show global status like ``'Uptime'``;
QPS = Questions / Uptime
基於Com_commit和Com_rollback計算出TPS:
mysql> show global status like ``'Com_commit'``;
mysql> show global status like ``'Com_rollback'``;
mysql> show global status like ``'Uptime'``;
TPS = (Com_commit + Com_rollback) / Uptime
另一計算方式:基於Com_select、Com_insert、Com_delete、Com_update計算出QPS
mysql> show global status where Variable_name ``in``(``'com_select'``,``'com_insert'``,``'com_delete'``,``'com_update'``);
等待1秒再執行,獲取間隔差值,第二次每個變數值減去第一次對應的變數值,就是QPS
TPS計算方法:
mysql> show global status where Variable_name ``in``(``'com_insert'``,``'com_delete'``,``'com_update'``);
計算TPS,就不算查詢操作了,計算出插入、刪除、更新四個值即可。
經網友對這兩個計算方式的測試得出,當資料庫中myisam表比較多時,使用Questions計算比較準確。當資料庫中innodb表比較多時,則以Com_*計算比較準確。