MySQL資料庫優化的最佳實踐

iteye發表於2014-08-20

1)謹慎而有效地使用索引

選擇合理的索引(字首性及可選性)、刪除沒有用的索引。

2)使用規範化,但不要使用過頭

規範化(至少是第三正規化)是一個易於理解且標準的方法。然而,在有些情況下,你可能希望違反這些規則。查詢表通常是規範化的產物,也就是說,你建立了一個特殊的表,這個表包含了在其他表中被頻繁使用的相關資訊的列表。然而,當使用那些經常被訪問且分佈有限(僅有或有限的行數擁有小值)的查詢表時,會使系統效能降低。在這種情況下,每次你使用查詢資訊,它們必須使用join以獲取完整資料。join的開銷很大,而且頻繁訪問會使開銷隨著時間逐漸增加。為了減少這種潛在的效能問題,可以使用列舉欄位儲存資料,而不是使用查詢表儲存資料。例如,可以使用列舉欄位儲存頭髮彩色值,而不是建立表來儲存頭髮顏色值,這樣還可以避免使用join.

3)使用正確的儲存引擎

mysql的最強大的功能之一是它支援不同的儲存引擎,儲存引擎管理如何儲存和恢復資料。mysql支援多個儲存引擎,每個儲存引擎具有獨特的功能和用途,可以使資料庫設計通過使用最合適他們的應用程式的儲存引擎來改善資料庫系統的效能。例如,如果有一個這樣的環境:使用事務控制高度活躍的資料庫,請選擇一個合適這個情況的儲存引擎(mysql的有些儲存引擎不支援事務),你還可能會發現這樣的檢視和表,它們常常被查詢但是幾乎不被更新(例如查詢表),在這種情況下,你可能希望使用儲存引擎將這些資料儲存在記憶體中,以便快速訪問它們。

InnoDB儲存引擎支援事務,在需要事務支援時,通常應該選擇這個儲存引擎,它是Mysql中目前唯一事務性的引擎。很多第三方儲存引擎支援事務,但是僅有InnoDB有”開包即用”選項。有趣的是,InnoDB中所有的索引都是B-trees,在這個B樹中索引記錄被儲存在樹的葉子項,InnoDB適用於高效能和事務處理環境。

MyISAM儲存引擎是Mysql預設引擎,如果你在create語句中省略了engine選項,那麼預設使用這個引擎。MyISAM經常在資料倉儲、電子商務和企業應用中使用。MyISAM使用高階快取和索引機制提高資料檢索速度,另外,當各種應用程式需要快速檢索資料而不需要事務時,MyISAM將是很好的選擇。

Blackhole儲存引擎是非常有趣的,它並不儲存任何東西。實際上,正如它的名字所言-儲存進去的資料永遠還會返回。Blackhole儲存引擎有個特殊的用途,如果啟用了二進位制日誌,SQL命令將被寫入這個日誌,這時,Blackhole儲存引擎被當做複製拓撲中的中繼代理使用。

Memory儲存引擎(有時被稱為HEAP)是記憶體中的儲存器,它使用雜湊機制頻繁檢索被使用過的資料,這樣可以更快地檢索,它訪問資料的方式與其他儲存引擎類似,但是資料儲存在記憶體中,並且只在mysql會話有效。當關機時,這些資料被重新整理並刪除掉。Memory儲存引擎通常用於以下情況:靜態資料被頻繁使用且很少被改變(如查詢表).

4)通過Query Cache使用檢視來加速結果

5)使用約束

6)使用explain、analyze、optimize

這些工具在診斷和調優時很重要,在不發生錯誤的前提下經常使用它們,但是請小心使用。具體來說,當analyze、optimize有意義且不是作為定期的預定的事件時使用它們。我們發現有些系統管理員晚上使用這些命令,但是一般情況下,這樣做是不值得的,並且會產生不必要的表副本。顯然,強制系統定期複製資料浪費時間,並會導致操作過程中的訪問有限。

相關文章