在許多很好的例子,技術(shù)和方法被世界上最好的
數(shù)據(jù)庫性能專家所高薦。我們將討論提高數(shù)據(jù)庫性能的最常用的方法,而不是評論或建議任何特定的工具或技術(shù)。
1)謹慎而有效地使用索引
選擇合理的索引(前綴性及可選性)、刪除沒有用的索引。
2)使用規(guī)范化,但不要使用過頭
規(guī)范化(至少是第三范式)是一個易于理解且標準的方法。然而,在有些情況下,你可能希望違反這些規(guī)則。查詢表通常是規(guī)范化的產(chǎn)物,也就是說,你創(chuàng)建了一個特殊的表,這個表包含了在其他表中被頻繁使用的相關(guān)信息的列表。然而,當使用那些經(jīng)常被訪問且分布有限(僅有或有限的行數(shù)擁有小值)的查找表時,會使系統(tǒng)性能降低。在這種情況下,每次你使用查詢信息,它們必須使用join以獲取完整數(shù)據(jù)。join的開銷很大,而且頻繁訪問會使開銷隨著時間逐漸增加。為了減少這種潛在的性能問題,可以使用枚舉字段存儲數(shù)據(jù),而不是使用查找表存儲數(shù)據(jù)。例如,可以使用枚舉字段存儲頭發(fā)彩色值,而不是創(chuàng)建表來存儲頭發(fā)顏色值,這樣還可以避免使用join.
3)使用正確的存儲引擎
mysql的最強大的功能之一是它支持不同的存儲引擎,存儲引擎管理如何存儲和恢復數(shù)據(jù)。mysql支持多個存儲引擎,每個存儲引擎具有獨特的功能和用途,可以使數(shù)據(jù)庫設計通過使用最合適他們的應用程序的存儲引擎來改善數(shù)據(jù)庫系統(tǒng)的性能。例如,如果有一個這樣的環(huán)境:使用事務控制高度活躍的數(shù)據(jù)庫,請選擇一個合適這個情況的存儲引擎(mysql的有些存儲引擎不支持事務),你還可能會發(fā)現(xiàn)這樣的視圖和表,它們常常被查詢但是幾乎不被更新(例如查找表),在這種情況下,你可能希望使用存儲引擎將這些數(shù)據(jù)存儲在內(nèi)存中,以便快速訪問它們。
InnoDB存儲引擎支持事務,在需要事務支持時,通常應該選擇這個存儲引擎,它是Mysql中目前唯一事務性的引擎。很多第三方存儲引擎支持事務,但是僅有InnoDB有"開包即用"選項。有趣的是,InnoDB中所有的索引都是B-trees,在這個B樹中索引記錄被存儲在樹的葉子項,InnoDB適用于高性能和事務處理環(huán)境。
MyISAM存儲引擎是Mysql默認引擎,如果你在create語句中省略了engine選項,那么默認使用這個引擎。MyISAM經(jīng)常在數(shù)據(jù)倉庫、電子商務和企業(yè)應用中使用。MyISAM使用高級緩存和索引機制提高數(shù)據(jù)檢索速度,另外,當各種應用程序需要快速檢索數(shù)據(jù)而不需要事務時,MyISAM將是很好的選擇。
Blackhole存儲引擎是非常有趣的,它并不存儲任何東西。實際上,正如它的名字所言-存儲進去的數(shù)據(jù)永遠還會返回。Blackhole存儲引擎有個特殊的用途,如果啟用了二進制
日志,
SQL命令將被寫入這個日志,這時,Blackhole存儲引擎被當做復制拓撲中的中繼代理使用。
Memory存儲引擎(有時被稱為HEAP)是內(nèi)存中的存儲器,它使用哈希機制頻繁檢索被使用過的數(shù)據(jù),這樣可以更快地檢索,它訪問數(shù)據(jù)的方式與其他存儲引擎類似,但是數(shù)據(jù)存儲在內(nèi)存中,并且只在mysql會話有效。當關(guān)機時,這些數(shù)據(jù)被刷新并刪除掉。Memory存儲引擎通常用于以下情況:靜態(tài)數(shù)據(jù)被頻繁使用且很少被改變(如查找表).
4)通過Query Cache使用視圖來加速結(jié)果
5)使用約束
6)使用explain、analyze、optimize
這些工具在診斷和調(diào)優(yōu)時很重要,在不發(fā)生錯誤的前提下經(jīng)常使用它們,但是請小心使用。具體來說,當analyze、optimize有意義且不是作為定期的預定的事件時使用它們。我們發(fā)現(xiàn)有些系統(tǒng)管理員晚上使用這些命令,但是一般情況下,這樣做是不值得的,并且會產(chǎn)生不必要的表副本。顯然,強制系統(tǒng)定期復制數(shù)據(jù)浪費時間,并會導致操作過程中的訪問有限。