如何優化數據庫?[轉]

1 數據庫結構優化

  1. 範式優化:表的設計合理化(符合3NF),比如消除冗餘(節省空間);
  2. 反範式優化:比如適當加冗餘等(減少join)
  3. 拆分表:分區將數據在物理上分隔開,不同分區的數據可以制定保存在處於不同磁盤上的數據文件裏。這樣,當對這個表進行查詢時,只需要在表分區中進行掃描,而不必進行全表掃描,明顯縮短了查詢時間,另外處於不同磁盤的分區也將對這個表的數據傳輸分散在不同的磁盤I/O,一個精心設置的分區可以將數據傳輸對磁盤I/O競爭均勻地分散開。對數據量大的時時表可採取此方法,可按月自動建表分區。

 

2 優化SQL語句

1)應儘量避免在 where 子句中使用 != 、< 、> 操作符,否則將引擎放棄使用索引而進行全表掃描;

2)應儘量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描;

3)很多時候用 exists 代替 in 是一個好的選擇;

4)用 WHERE 子句替換 HAVING 子句,因爲 HAVING 只會在檢索出所有記錄之後纔對結果集進行過濾;

5)迅速的定位執行速度慢的語句、開啓慢查詢、設置慢查詢時間、啓用慢查詢日誌、通過 mysqldumpslow 工具對慢日誌進行分類彙總;

6)析SQL語句,通過 explain 分析查詢、通 profiling 可以得到更詳細的信息;

7)創建索引(主鍵索引/唯一索引/全文索引/普通索引);

8)避免 Select * (不查詢多餘的列與行);

9)使用視圖(經常被查詢的列數據,並且這些數據不被經常的修改,刪除);

 

3 分表技術(水平分割、垂直分割)、分區技術

如果遇到大表的情況下,SQL語句優化已經無法繼續優化了,我們可以考慮分表和分區,目的就是減少數據庫的負擔,提高數據庫的效率,通常點來講就是提高表的增刪改查效率。

分表是將一個大表按照一定的規則分解成多張具有獨立存儲空間的實體表,我們可以稱爲子表,每個表都對應三個文件,MYD數據文件,.MYI索引文件,.frm表結構文件。這些子表可以分佈在同一塊磁盤上,也可以在不同的機器上。app讀寫的時候根據事先定義好的規則得到對應的子表名,然後去操作它。

分區和分表相似,都是按照規則分解表。不同在於分表將大表分解爲若干個獨立的實體表,而分區是將數據分段劃分在多個位置存放,可以是同一塊磁盤也可以在不同的機器。分區後,表面上還是一張表,但數據散列到多個位置了。app讀寫的時候操作的還是大表名字,db自動去組織分區的數據。

  1. 都能提高mysql的性能,在高併發狀態下都有一個良好的表現;
  2. 分表和分區不矛盾,可以相互配合的,對於那些大訪問量,並且表數據比較多的表,我們可以採取分表和分區結合的方式,訪問量不大,但是表數據很多的表,我們可以採取分區的方式等;
  3. 分表技術是比較麻煩的,需要手動去創建子表,app服務端讀寫時候需要計算子表名。採用merge好一些,但也要創建子表和配置子表間的union關係;
  4. 分區相對於分表,操作方便,不需要創建子表。

 

4 讀寫分離

  • 方法一:php程序上自己做邏輯判斷,寫php代碼的時候,自己在程序上做邏輯判讀寫匹配。select,insert、update、delete做正則匹配,根據結果選擇寫服務器(主服務器)。如果是select操作則選擇讀服務器(從服務器器) mysql_connect('讀寫的區分')
  • 方法二:MySQL中間件,基本的原理是讓主數據庫處理寫操作(insert、update、delete),而從數據庫處理查詢操作(select)。而數據庫的一致性則通過主從複製來實現。所以說主從複製是讀寫分離的基礎。

 

5 存儲過程 [模塊化編程,可以提高速度]

存儲過程是SQL語句控制語句的預編譯集合,保存在數據庫中,可有應用程序調用執行,而且允許用戶聲明變量、邏輯控制語句及其他強大的編程功能。包含邏輯控制語句和數據操作語句,可以接收參數、輸出參數、返回單個或多個結果值及返回值。

使用存儲過程的優點:模塊化程序設計,只需創建一次,以後即可調用該存儲過程任意次;執行速度快,效率高;減少網絡流量;具有良好的安全性。

 

6 對mysql配置優化 [配置最大併發數, 調整緩存大小]

 

7 MySQL服務器硬件升級

 

8 定時的去清除不需要的數據, 定時進行碎片整理

  • 查看錶碎片的方法
  • Innodb存儲引擎清理碎片方法
  • Myisam存儲引擎清理碎片方法

注意:MySQL碎片整理儘量選擇業務不繁忙時清理,一個月清理一次即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章