精簡語句吧,讓你的MySQL更有效
原創(chuàng)【51CTO獨家譯文】簡易教學(xué)之快速提高擴展性
通過幾條簡單的規(guī)則,我們可以方便地提高MySQL服務(wù)器的擴展性。以下是實例之一。
“改進SQL語句最有效的方法是進行精簡”
精簡SQL語句的方法林林總總,但在列舉由客戶處觀察得出的典型范例之前,請允許我先對提高擴展性的基本前提條件做出解釋。
MySQL的核心只允許在給定的時間段(例如每秒)中借由物理過程來運行一定數(shù)量的SQL語句。無論你的計算機有多么強力,這一物理過程始終存在運算上限。如果你能夠?qū)QL語句中那些不具備關(guān)鍵性或必要性的部分精簡掉,那么與此同時,真正重要的SQL語句也將自動得到優(yōu)先處理。當(dāng)然這也將帶來其它一些連鎖反應(yīng),但只是簡單數(shù)學(xué)范疇內(nèi)的小問題。總之,要運行更多SQL指令,首先對你的指令進行精簡。
在此我們列舉一個簡單的例子,通過mk-query-digest工具對TCP/IP數(shù)據(jù)包進行分析并輸出結(jié)果。
- # Rank Query ID Response time Calls R/Call Apdx V/M Item
- # ==== ================== ============= ===== ====== ==== ===== ==========
- # 1 0xD631CB919867DB50 0.0436 47.3% 92 0.0005 1.00 0.00 SELECT TTDOD
- # 2 0x04FE01C5B31FD305 0.0258 27.9% 329 0.0001 1.00 0.00 ADMIN PING
- # 3 0x93321857BCD8E771 0.0229 24.8% 36 0.0006 1.00 0.00 SELECT TTD
其中存在很多問題,包括SQL的一次一行(RAT)特性,不過在這里我們暫不討論ping過多的問題。首先讓我們看看***個語句。
- SELECT `Date` FROM TTDOD WHERE ID = 9999;
表面上看這個查詢指令已經(jīng)夠簡潔了,但讓我們再看看列表。
- mysql> select count(*) from TTDOD;
- +----------+
- | count(*) |
- +----------+
- | 0 |
- +----------+
在這種情況下,因為當(dāng)前列表是空的,所以查詢指令將不會返回任何內(nèi)容。當(dāng)然這一點在未來可能會發(fā)生變化,但就目前來看這更多的是一種在簡單數(shù)據(jù)管理中的異常處理狀態(tài),因為該列表中很少會存在內(nèi)容。而建立一種有針對性的解決方案來通知該應(yīng)用程序,可以完全避免這類不必要的查詢行為。
以上只是個運行時間不足2秒的參考實例,而清除***個查詢指令也已經(jīng)使整體查詢時耗降低了20%。不管這僅僅是個典型的載入過程抑或是批處理中的并行載入過程,原理都是共通的。而且毫無疑問,在接下來的查詢指令中,我們的精簡工作還大有可為。
原文地址:http://ronaldbradford.com/blog/simple-lessons-in-improving-scalability-2011-02-16/
【編輯推薦】