性能優(yōu)化
索引
索引指向數(shù)據(jù)庫中具體數(shù)據(jù)所在的一個位置,同事在列上創(chuàng)建一個索引可以排列該列上的信息。當(dāng)服務(wù)器需要訪問該信息進(jìn)行 查詢時,就會知曉在什么地方進(jìn)行查詢,因?yàn)樗饕赶蛴嘘P(guān)位置。
如果一個列涉及查詢,分組,排序,索引將可以達(dá)到提高性能的效果。
帶很多重復(fù)值的索引不會產(chǎn)生很好的結(jié)果。
可以使用表來聯(lián)合多個非唯一的索引,以便改善性能。
索引越多,性能不一定越好。添加一個索引,并不一定能改善性能。
查詢高速緩存
在運(yùn)行select查詢時,MySQL4.x會記錄下查詢和返回結(jié)果。這是通過select每次進(jìn)行查詢時,在一個特殊的高速緩存中保存 結(jié)果集實(shí)現(xiàn)的。然后,當(dāng)再次請求服務(wù)器做相同的查詢時,MySQL將會從高速緩存中檢索結(jié)果,而不是再次運(yùn)行該查詢。 默認(rèn)情況下是啟動這個性能。
注意,一旦表有變化,使用這個表的高速緩存查詢就變成無效,并且將從高速緩存中刪除。這樣防止查詢從舊表上返回 不準(zhǔn)確的數(shù)據(jù)。經(jīng)常有變化的表,將不會從高速緩存中得到利益。這種情況,可以考慮不使用高速緩存, 可以添加一個選項(xiàng)sql_no_cache來實(shí)現(xiàn)。
查詢分析
在select查詢開始處加上一個explain關(guān)鍵字,將告訴MySQL返回一個圖表,說明這個查詢?nèi)绻M(jìn)行處理, 在這個圖表里涉及了查詢將訪問哪個表的信息以及查詢希望返回的行數(shù)的信息。這個信息可以用來查看哪些表可以添加索引, 以便加快執(zhí)行速度,分析瓶頸的位置。
通過查詢的顯示結(jié)果,可以知道什么位置可以添加索引,進(jìn)行迅速的改正。
優(yōu)化多表查詢
子查詢是一個嵌套在另一個select語句中的select語句。子查詢經(jīng)常用來把一個復(fù)雜的查詢拆分為一些列的邏輯步驟, 或者使用其他查詢結(jié)果回答一個查詢。其結(jié)果是不需要執(zhí)行兩個或者更多的單獨(dú)查詢,就可以執(zhí)行一項(xiàng)包含一項(xiàng)或者多項(xiàng)子查詢 的簡單查詢。
MySQL可以比子查詢更好的優(yōu)化連接,所以如果發(fā)現(xiàn)在自己的MySQL服務(wù)器上的負(fù)載平均值達(dá)到了無法接受的高水平,就應(yīng)該 檢驗(yàn)應(yīng)用程序代碼,并試著重寫作為連接和連接序列的子查詢。
可以通過有效的使用MySQL的集合性能和修改程序來把低效的子查詢轉(zhuǎn)變?yōu)楦鼮橛行У倪B接。
如果希望避免中間使用嵌套查詢,還可以使用基于會話的服務(wù)器變量。
使用臨時表
MySQL還允許使用create temporary table命令創(chuàng)建臨時表。這種表之所以這么稱呼,是因?yàn)樗会槍我坏腗ySQL會話 過程而存在的,當(dāng)使用這些表的客戶機(jī)關(guān)閉了與MySQL服務(wù)器的連接時,它將自動刪除。
因?yàn)榕R時表保存在內(nèi)存中,所以要比基于磁盤的表明顯的快。結(jié)果可以有效的作為中間存儲區(qū)域,以便提高查詢實(shí)施的速度, 幫助把復(fù)雜的的拆分為更簡單的部件,或者作為子查詢和連接支持的代替。
優(yōu)化表設(shè)計
為了使查詢能夠更加精煉,需要考慮表設(shè)計方面的一些因素。首先,如果經(jīng)常查詢的表會發(fā)生很多變化,改進(jìn)性能的方式就是使用 定長字段,不適用變長字段。雖然使用定長字段將浪費(fèi)更多的磁盤空間,但是從查詢角度看,MySQL處理定長字段比變長字段更快。
改善性能的另一項(xiàng)技術(shù)是使用optimize table命令處理經(jīng)常需要修改的表。經(jīng)常修改表會導(dǎo)致磁盤碎片,以致花費(fèi)額外的時間 去讀取沒有用的空間塊,以便得到希望的數(shù)據(jù)。
在考慮改善性能時,還要檢查是否需要針對已經(jīng)建立的所有表。額外的表意味著性能降低。沒有必要合并的表,則應(yīng)試著匹配連接的 列。
調(diào)整服務(wù)器設(shè)置
如果希望服務(wù)器更加有效的運(yùn)行,最佳解決方案是加大內(nèi)存空間和使用更大更快的磁盤。但是更多時候,條件是不允許是的。 此時,我們需要一些改進(jìn)服務(wù)器的常規(guī)技術(shù)。
調(diào)整服務(wù)器變量,key_buffer_size變量控制MySQL索引緩沖可以使用內(nèi)存的數(shù)量。值越高,索引可以使用的內(nèi)存越多,性能越好。 一般情況,這個值保持在可使用內(nèi)存總量的25%到30%。table_cache變量控制表高速緩存可以使用內(nèi)存的數(shù)量,以及在同一時間 內(nèi)MySQL可以處理表的打開總量。對于有很多數(shù)據(jù)庫和表的非常忙的服務(wù)器來說,應(yīng)該增加這個值,使用set修改。
一旦修改了一個全局服務(wù)器變量,關(guān)閉服務(wù)器之前,這些變量一直存在,但是重啟服務(wù)器之后,變量恢復(fù)默認(rèn)狀態(tài)。 所以最好是進(jìn)行永久性修改。