網(wǎng)(LieHuo.Net)教程 數(shù)據(jù)庫優(yōu)化是一項(xiàng)很復(fù)雜的工作,因?yàn)檫@最終需要對系統(tǒng)優(yōu)化的很好理解才行。盡管對系統(tǒng)或應(yīng)用系統(tǒng)的了解不多的情況下優(yōu)化效果還不錯,但是如果想優(yōu)化的效果更好,那么就需要對它了解更多才行。
本章主要講解了幾種優(yōu)化MySQL的方法,并且給出了例子。記著,總有各種辦法能讓系統(tǒng)運(yùn)行的更快,當(dāng)然了,這需要更多的努力。
1 優(yōu)化概述
讓系統(tǒng)運(yùn)行得快得最重要因素是數(shù)據(jù)庫基本的設(shè)計(jì)。并且還必須清楚您的系統(tǒng)要用來做什么,以及存在的瓶頸。
最常見的系統(tǒng)瓶頸有以下幾種:
磁盤搜索。它慢慢地在磁盤中搜索數(shù)據(jù)塊。對現(xiàn)代磁盤來說,平時的搜索時間基本上小于10毫秒,因此理論上每秒鐘可以做100次磁盤搜索。這個時間對于全新的新磁盤來說提高的不多,并且對于只有一個表的情況也是如此。加快搜索時間的方法是將數(shù)據(jù)分開存放到多個磁盤中。
磁盤讀/寫。當(dāng)磁盤在正確的位置上時,就需要讀取數(shù)據(jù)。對現(xiàn)代磁盤來說,磁盤吞吐量至少是10-20MB/秒。這比磁盤搜索的優(yōu)化更容易,因?yàn)榭梢詮亩鄠€媒介中并行地讀取數(shù)據(jù)。
CPU周期。數(shù)據(jù)存儲在主內(nèi)存中(或者它已經(jīng)在主內(nèi)存中了),這就需要處理這些數(shù)據(jù)以得到想要的結(jié)果。存在多個?硐啾饒?jiān)煁茌量来说?竅拗頻囊蛩亍2還?孕"砝此擔(dān)?俁韌ǔ2皇俏侍狻?
內(nèi)存帶寬。當(dāng)CPU要將更多的數(shù)據(jù)存放在CPU緩存中時,主內(nèi)存的帶寬就是瓶頸了。在大多數(shù)系統(tǒng)中,這不是常見的瓶頸,不過也是要注意的一個因素。
1.1 MySQL 設(shè)計(jì)的局限性
當(dāng)使用MyISAM存儲引擎時,MySQL會使用一個快速數(shù)據(jù)表鎖以允許同時多個讀取和一個寫入。這種存儲引擎的最大問題是發(fā)生在一個單一的表上同時做穩(wěn)定的更新操作及慢速查詢。如果這種情況在某個表中存在,可以使用另一種表類型。詳情請看"15 MySQL Storage Engines and Table Types"。
MySQL可以同時在事務(wù)及非事務(wù)表下工作。為了能夠平滑的使用非事務(wù)表(發(fā)生錯誤時不能回滾),有以下幾條規(guī)則:
所有的字段都有默認(rèn)值
如果字段中插入了一個"錯誤"的值,比如在數(shù)字類型字段中插入過大數(shù)值,那么MySQL會將該字段值置為"最可能的值"而不是給出一個錯誤。數(shù)字類型的值是0,最小或者最大的可能值。字符串類型,不是空字符串就是字段所能存儲的最大長度。
所有的計(jì)算表達(dá)式都會返回一個值而報(bào)告條件錯誤,例如 1/0 返回 NULL。
這些規(guī)則隱含的意思是,不能使用MySQL來檢查字段內(nèi)容。相反地,必須在存儲到數(shù)據(jù)庫前在應(yīng)用程序中來檢查。詳情請看"1.8.6 How MySQL Deals with Constraints 和 "14.1.4 INSERT Syntax"。