Mysql 優化

myjob發表於2019-06-11

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_*計算比較準確。

相關文章