1. 程式人生 > >資料庫篇(八)——優化查詢

資料庫篇(八)——優化查詢

資料庫優化查詢的方法有:

1、使用索引

儘量避免全表掃描,首先應考慮在where及order by,group by涉及的列上建立索引。

2、優化SQL語句

  • 通過explain來檢視SQL語句的執行效果,可以幫助選擇更好的索引和優化查詢語句。例如:
explain select * from news;
  • 不要返回用不到的欄位
  • 不在索引列做運算或者使用函式
  • 查詢儘可能使用limit減少返回的行數,減少資料傳輸時間和頻寬浪費

3、優化資料庫物件

  • 優化表的資料型別

    select * from 表名 procedure analyse();
  • 對錶進行拆分:
    可以提高表的訪問效率。有兩種拆分方法:
    • 垂直拆分:把主鍵和一些列放在一個表中,然後把主鍵和另外的列放在另一個表中。
      使用場景:如果一個表中某些列常用,另外一些不常用,就可以垂直拆分。
    • 水平拆分:根據一列或者多列資料的值把資料行放到兩個獨立的表中。
  • 使用中間表來提高查詢速度:
    建立中間表,表結構和源表結構完全相同,轉移要統計的資料到中間表,然後在中間表上進行統計,得出想要的結果。

4、硬體優化

  • CPU 優化:選擇多核和主頻高的CPU
  • 記憶體優化:儘量多的記憶體分配給MySQL做快取
  • 磁碟I/O的優化:使用磁碟陣列;調整磁碟排程演算法

5、MySQL自身的優化

對my.cnf中的各項引數進行優化調整。

6、應用優化

  • 使用資料庫連線池
  • 使用查詢快取

問題:如果有一個特別大的訪問量到資料庫上,怎麼優化?

1、使用優化查詢的方法;

2、主從複製、讀寫分離、負載均衡:

主從複製通過配置兩臺(或多臺)資料庫的主從關係,可以將一臺資料庫伺服器的資料更新到另一臺伺服器上。

網站可以利用這一功能,實現資料庫的讀寫分離,從而改善資料庫的負載壓力。一個系統的讀操作遠遠多於寫操作,因此寫操作發向master,讀操作發向slaves進行操作(簡單的輪詢演算法來決定使用哪個slave)。
利用資料庫的讀寫分離,web伺服器在寫資料的時候,訪問主資料庫(master),主資料庫通過主從複製機制將資料同步更新到從資料庫(slave),這樣當web伺服器讀資料的時候,就可以通過從資料庫獲取。如此,主資料庫只需要承受少量的寫入操作,還可以實現資料熱備份。

主從複製的原理:

(1)master將資料改變記錄到二進位制日誌(binary log)中,也是配置檔案log-bin指定的檔案(注意MySQL會在執行語句之後,釋放鎖之前,寫入二進位制日誌,確保事務安全
(2)slave將master的二進位制日誌事件拷貝到中繼日誌(relay log)
(3)slave重做中繼日誌中的事件。將master上的改變反映到自己的資料庫中。所以主從資料庫的資料是完全一致的。
注意:時間上肯定有延遲,slave的資料是滯後的!

主從複製的幾種方式:

(1)同步複製:主伺服器在將更新的資料寫入他的二進位制日誌檔案後,必須等待驗證所有的從伺服器的更新資料是否已經複製到其中,之後才可以自由處理其他的事務處理請求。
(2)非同步複製:主伺服器在將更新的資料寫入到他的二進位制日誌檔案後,無需等待驗證從伺服器是否完成複製。就可以自由處理其他事務請求。
(3)半同步複製:主伺服器在將更新的資料寫入到他的二進位制日誌檔案後,只需等待其中一臺伺服器的更新資料是否完成複製,就可以自由處理其他事務請求,其他的從伺服器不用管。

3、資料庫分表,分割槽,分庫

分表見以上;
分割槽:把一張表的資料分成多個區塊,這些區塊可以在一個磁碟上,也可以在不同的磁碟上,分割槽後,表面上還是一張表,但資料雜湊在多個位置,這樣一來,多塊硬碟同時處理不同的請求,從而提高磁碟I/O讀寫效能,實現比較簡單。包括水平分割槽和垂直分割槽。
分庫:根據業務不同把相關的表切分到不同的資料庫中,比如web、bbs、blog等庫。