數(shù)據(jù)庫(kù)的性能取決于很多因素,比如:表,查詢(xún),和配置。配置就是最簡(jiǎn)單的算法,用于調(diào)整程序邏輯,以便適應(yīng)更多場(chǎng)景。優(yōu)化主要從如下幾個(gè)方面進(jìn)行:
- 硬件層面
- 數(shù)據(jù)庫(kù)層面
- 可移植和性能的平衡
硬件層面
隨著數(shù)據(jù)庫(kù)的越來(lái)越忙碌,任何一個(gè)數(shù)據(jù)庫(kù)應(yīng)用最終會(huì)受到硬件的制約。一個(gè)DBA一定要評(píng)估是否可以通過(guò)調(diào)整應(yīng)用或者重新配置服務(wù)器來(lái)避免瓶頸,是否需要更多硬件資源。系統(tǒng)瓶頸一般有如下幾個(gè)來(lái)源:
磁盤(pán)尋址
磁盤(pán)上尋找一塊數(shù)據(jù)的時(shí)間。在現(xiàn)在的磁盤(pán)中,平均時(shí)間通常小于10ms,所以我們可以尋找100次在1s內(nèi)。這個(gè)時(shí)間對(duì)于新磁盤(pán)有小幅度提高,對(duì)單表的優(yōu)化非常難。優(yōu)化尋找數(shù)據(jù)的時(shí)間是將數(shù)據(jù)分布到多個(gè)磁盤(pán)。磁盤(pán)讀寫(xiě)
當(dāng)磁盤(pán)到達(dá)正確的位置,我們需要讀寫(xiě)數(shù)據(jù)?,F(xiàn)在磁盤(pán)中,一個(gè)磁盤(pán)吞吐至少10-20MB/S。你可以通過(guò)并行讀取多個(gè)磁盤(pán)。CPU周期
當(dāng)數(shù)據(jù)在內(nèi)存的時(shí)候,我們?yōu)榱说玫浇Y(jié)果來(lái)處理數(shù)據(jù)。大量的大表是主要的因素。對(duì)于小表,完全不是問(wèn)題。主存帶寬
當(dāng)CPU需要更多數(shù)據(jù),而不是命中CPU自帶的緩存。主存帶寬就是一個(gè)瓶頸,多數(shù)系統(tǒng)基本不會(huì)是這個(gè)瓶頸。
數(shù)據(jù)庫(kù)層面
- 表結(jié)構(gòu)的合理性。列的數(shù)據(jù)類(lèi)型的合理性,一個(gè)表中列的合理性。比如:多更新數(shù)據(jù)應(yīng)該設(shè)計(jì)多表(少列),分析大量數(shù)據(jù)則設(shè)計(jì)成少表(多列)。
- 合理的索引。索引的數(shù)據(jù)結(jié)構(gòu)偉B樹(shù),查詢(xún)效率很高。而且Mysql的鎖的機(jī)的粒度就是基于索引。
- 對(duì)于行的格式設(shè)定。Mysql的行的設(shè)置模式有:COMPACT,REDUNDANT,DYNAMIC,COMPRESSED。引擎Innodb默認(rèn)COMPACT。
- 正確的鎖策略。分為共享模式和排他模式,選用Innodb引擎性能更好。
- 配置緩存合適的大小。具體就是配置InnoDB buffer pool合適的大小。
可移植和性能的平衡
編寫(xiě)高新能的SQL語(yǔ)句(Mysql 特殊SQL方言)和可移植的SQL語(yǔ)句需要進(jìn)行取舍。