快速提高MySQL性能的10大“殺手锏”
伴隨著應用的頻繁使用,軟件也變得越來越慢,可能是內(nèi)存的問題,可能是軟件設計的問題的,但是你有沒有想過,你天天操作的數(shù)據(jù)庫也會拖累你的應用程序呢?
下面就教你十招,搞定數(shù)據(jù)庫性能,讓你的應用飛起來。讓小編帶你來一一見識它們的獨特之處。
殺手锏1: 設置一定時間后優(yōu)化重建數(shù)據(jù)庫
MySQL check –o –all –database 會讓ibdata1不斷的增大,因此真正的優(yōu)化只能是重建數(shù)據(jù)庫表結構。
殺手锏2 :減少磁盤寫入的操作
- 準備足夠大的寫入緩存 innodb_log_file_size,這個語句和寫磁盤操作有密切的聯(lián)系
- 避免雙寫入緩沖
殺手锏3 :提高磁盤讀寫效率
RAID0 在使用名為EC2虛擬磁盤時,使用RAIDO 可以極大的提高磁盤的讀寫效率
殺手锏4 :多使用UNION INDEX 來代替UNION
我們知道使用索引能夠有效的減少數(shù)據(jù)庫中的數(shù)據(jù)量來提高查詢效率,因為索引可以直接尋找目標對象,不需要全部檢索一遍數(shù)據(jù)庫的。
舉個例子吧:數(shù)據(jù)庫索引 就如同在圖書管理尋找你所要找的圖書,查詢系統(tǒng)之后我們能夠知道那本本在哪個區(qū)域,在那個貨架,那樣就可以快速的找到我們所想要的圖書。不需要在偌大的圖書館里一本一本的尋找,數(shù)據(jù)庫索引就是這樣相同的道理。
索引代碼:
使用索引在數(shù)據(jù)庫中查詢用戶的 賬號和密碼:
殺手锏5 :將數(shù)據(jù)庫保存在內(nèi)存磁盤中
隨著硬盤技術的提高,很多人都會將數(shù)據(jù)庫存放在固態(tài)磁盤(SSD)中,盡管當前的固態(tài)磁盤比移動硬盤快的多,但是它仍然不能與電腦的內(nèi)存(RAM)相比,畢竟數(shù)據(jù)從系統(tǒng)內(nèi)存中讀取要比其他一切存儲都要快,建議使用內(nèi)存磁盤。
隨著現(xiàn)在電腦設備技術的前進,你不在需要將所有的數(shù)據(jù)庫都存入內(nèi)存中,就可以獲取內(nèi)存中大部分性能優(yōu)勢,你只需要將經(jīng)常使用到的數(shù)據(jù)存入內(nèi)存中即可。
在上面的圖表中,您可以看到高達每秒2,000個I/O操作,可以看出來將頻繁使用的數(shù)據(jù)存入到內(nèi)存中很適合。
殺手锏6:充分利用日志查詢
將所有的查詢記錄,使用ORM系統(tǒng)或者生成查詢語句系統(tǒng)比較有效。
切記,請不要在生成環(huán)境使用,不然你的磁盤空間會被占滿的。
執(zhí)行1s的查詢:
殺手锏7:用NOSQL的方式來使用MySQL
使用HnadleSocket跳過MySQL的SQL解析層,使得MySQL 變?yōu)檎嬲腘LSQL.
殺手锏8:使用JOIN (連接)來替代子查詢
MySQL 4.1 之后開始支持子查詢,即可以使用select 來創(chuàng)建一個單列的查詢結果,然后將這個查詢結果作為條件在另一個查詢中使用。舉個例子:我們現(xiàn)在需要在系統(tǒng)中,將沒有任何訂單的客戶從系統(tǒng)中刪除,此時我們可以使用子查詢,先從銷售單 表中將所有有訂單的客戶ID取出,然后將ID 傳遞給主查詢。
接下里我們找出沒有訂單的客戶ID,進一步優(yōu)化。
我們知道使用子查詢可以一次性就完成,原本需要很多步驟才能夠完成的SQL操作,同時還可以避免表鎖死,同時操作簡單。
含有join的連接來代替子連接,查詢速度會變得更快,原因是:MySQL不需要在內(nèi)存中再創(chuàng)建臨時表來完成這個主查詢和子查詢這兩個步驟,自然而然使用JOIN 連接就變得很快了。
殺手锏9:盡量使用”=”而不用”> ”或者”<”
“=” 擴大了索引的范圍
殺手锏10:不要總是使用 “SELECT *”
在正常情況下,使用索引是可以提高查詢速度的。但是當SQL語句使用累贅時,索引將無法發(fā)揮它應有的作用。
很顯然,雖然下面兩個查詢返回的結果都是一樣的,但是后者的效率要高很多。
下面的語句:
結論:
MySQL的性能優(yōu)化可能方法很多,但是我例舉出來的這10個方法是經(jīng)常使用到的。如果你有更好的方法,請告訴我。