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