1.影響mysql性能的因素

####問:影響mysql性能的因素有哪些?
答:

  1. 服務器硬件
  2. 磁盤io
  3. 網卡流量
  4. 操作系統(32位,64位,系統不同性能不同,另外操作系統的一些參數也會影響db性能)
  5. mysql存儲引擎(一主多從,兩主多從等等)
  6. mysql架構設計( innodb,myisam,archive 等等)
  7. mysql表格設計(影響挺大)
  8. 日誌文件格式(二進制日誌格式,基於段的格式STATEMENT,基於行的格式ROW)
  9. sql查詢速度(慢查詢,工作中這個接觸較多)
  10. 大事務(運行時間長,或操作數據量大)
  11. 大表(記錄行數巨大,單表超過千萬行。或表文件巨大,超過10G)

前3者均可通過更換更好的硬盤解決,日常工作中主要通過優化 4-11 這些點來提高服務性能。
但第6點也不是絕對的,比如該表只是記錄日誌,幾乎沒有 update 和 delete 操作,就算超過千萬行數據,對業務影響也不大。



####問:硬件影響性能的方面?
答:

  1. 硬盤(機械,固態)
  2. 內存
  3. RAID等級

一般來說:對於讀寫比較頻繁的,適合選擇RAID10。對於不頻繁的,比如從庫,可以選擇RAID 0 或者 RAID 5,但要小心 RAID 5 出現磁盤損壞後,帶來 IO 大幅下降,所帶來主從大幅延遲問題。



####問:操作系統對db性能的影響?
答:在選擇操作系統時,要選擇專爲 服務器 設計的版本,而不是桌面版本

下面列舉一些 centos 系統影響db的部分參數:

net.core.somaxconn = 65535
決定最大監聽隊列的長度(tcp連接)
這參數系統默認很小,對於負載大的服務器來說不夠,一般來說設置成2048
*

以上3個主要用於加快tcp連接的回收
*

決定tcp連接 接收和發送 緩衝區大小的默認值和最大值,對於db服務器來說,應該把這幾個參數調整大點
*

用於減少失效連接tcp 所佔用的系統資源,加快資源回收的效率
*



####問:文件系統對性能的影響?

EXT3,EXT4,XFS都是有日誌功能的,日誌功能對日誌的安全性非常重要,更適合db,傳聞XFS性能更高,所以建議使用XFS文件系統



####問:mysql表設計哪些會對性能造成不好的影響?

  1. 過度的反範式化爲表建立太多的列
  2. 過分的範式化造成太多的表關聯
  3. 在OLTP環境中使用不恰當的分區表
  4. 使用外鍵保證數據的完成性


####問:大表對性能的影響?
答:
建立索引需要較長時間
(mysql5.5之前版本建立索引會鎖表,5.5之後不會鎖表但會造成較大主從延遲)
修改表結構會造成長時間的鎖表

問:如何優化?
答:1. 分庫分表; 2. 歷史數據歸檔

分庫分表難度在於分表主鍵的選擇和分表後數據的跨分區查詢和統計。
比如 分表後,如果數據不能比較平均的分佈,還是主要集中在那幾個表,這樣對業務性能的提升並不高,反而還會增加查詢統計的難度。

歷史數據歸檔:將部分數據歸檔到另外的數據數
比如 日誌數據,可以選擇在一個月後將數據歸檔到另一個數據庫
比如 訂單數據,可以選擇一年後的數據歸檔到另一個數據庫
另外,核心數據庫歸檔數據庫 可以放在不同的服務器,減少 核心服務器 的壓力
再在前端增加一個歷史記錄查詢的接口,方便統計人員統計。對後端人員來說,已經歸檔的訂單,一般都是正常完成交易的訂單,對後端的統計也沒什麼影響。
難度在於歸檔操作時,需要將數據剪切到另外的數據庫,操作的數據量教大,有難度,輕則產生主從延遲,重則影響主業務的使用



####問:大事務的影響?
答:鎖定太多的數據,造成大量的阻塞和鎖超時,回滾時所需時間比較長,造成主從延遲。

優化方法是避免一次處理太多數據,另外移出不必要在事務中的 select 操作



####總結:
在日常工作中,一般優化 db 性能的順序如下

  1. 數據庫表結構設計和 sql 語句
  2. 數據庫 存儲引擎 的選擇和 參數配置
  3. 系統選擇 及 優化
  4. 硬件升級