《MYSQL數(shù)據(jù)庫優(yōu)化MySQL數(shù)據(jù)庫中的查詢語句詳解》要點(diǎn):
本文介紹了MYSQL數(shù)據(jù)庫優(yōu)化MySQL數(shù)據(jù)庫中的查詢語句詳解,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
很多時(shí)候基于php+MySQL建立的網(wǎng)站所出現(xiàn)的系統(tǒng)性能瓶頸往往是出在MySQL上,而MySQL中用的最多的語句就是查詢語句,因此,針對(duì)MySQL數(shù)據(jù)庫查詢語句的優(yōu)化就顯得至關(guān)重要!本文就此問題做出詳細(xì)分析如下:MYSQL數(shù)據(jù)庫
1、判斷是否向MySQL數(shù)據(jù)庫哀求了不需要的數(shù)據(jù),如下列情況:MYSQL數(shù)據(jù)庫
(1)、查詢不必要的數(shù)據(jù),例如你必要10條數(shù)據(jù),但是你選出了100條數(shù)據(jù)加了limit做限制.
(2)、多表關(guān)聯(lián)時(shí)返回全部列
(3)、總是取出全部列select*......取出全部列,會(huì)讓優(yōu)化器無法完成索引覆蓋掃描這類優(yōu)化,還為服務(wù)器帶來額外的I/O、內(nèi)存、和cpu的消耗
(4)、重復(fù)查詢相同的數(shù)據(jù)例如,在用戶評(píng)論的地方必要查詢用戶的頭像的URL,那么用戶多次評(píng)論的時(shí)候?qū)⑦@個(gè)數(shù)據(jù)緩存起來,必要的時(shí)候從緩存取出,這樣性能會(huì)更好.MYSQL數(shù)據(jù)庫
2、mysql是否在掃描額外的記錄MYSQL數(shù)據(jù)庫
最簡(jiǎn)單衡量查詢開銷的三個(gè)指標(biāo)如下:響應(yīng)時(shí)間、掃描的行數(shù)、返回的行數(shù)MYSQL數(shù)據(jù)庫
響應(yīng)時(shí)間:服務(wù)時(shí)間和排隊(duì)時(shí)間.服務(wù)時(shí)間是指數(shù)據(jù)庫處理這個(gè)查詢真正花費(fèi)的時(shí)間.排隊(duì)時(shí)間是指服務(wù)器因?yàn)榈却承┵Y源而沒有真正執(zhí)行的查詢.MYSQL數(shù)據(jù)庫
掃描的行數(shù)和返回的行數(shù):抱負(fù)情況下掃描的行數(shù)和返回的行數(shù)應(yīng)該是相同的.MYSQL數(shù)據(jù)庫
一般MYSQL能夠使用如下三種方式應(yīng)用where條件記錄,從好到壞依次為:MYSQL數(shù)據(jù)庫
(1)、在索引中使用where條件來過濾不匹配的記錄,在存儲(chǔ)索引層完成.MYSQL數(shù)據(jù)庫
(2)、使用索引覆蓋掃描來返回記錄,直接從索引中過濾不必要的記錄并返回命中的結(jié)果,在mysql服務(wù)器層完成,但無需在回表查詢記錄.MYSQL數(shù)據(jù)庫
(3)、從數(shù)據(jù)表中返回?cái)?shù)據(jù),然后過濾不滿足條件的記錄,在mysql服務(wù)器層完成,必要先從數(shù)據(jù)表讀出記錄然后過濾MYSQL數(shù)據(jù)庫
如果發(fā)現(xiàn)查詢必要掃描大量的數(shù)據(jù)但返回少數(shù)的行,那么通常可以嘗試下面的技巧:MYSQL數(shù)據(jù)庫
(1)、使用索引覆蓋掃描,把所有必要的列都放到索引中,這樣存儲(chǔ)引擎無須返回表獲取對(duì)應(yīng)行就可以返回結(jié)果了.MYSQL數(shù)據(jù)庫
(2)、改變庫表結(jié)構(gòu),使用單獨(dú)的匯總表.MYSQL數(shù)據(jù)庫
(3)、重寫這個(gè)復(fù)雜的查詢MYSQL數(shù)據(jù)庫
3、重構(gòu)查詢的方式MYSQL數(shù)據(jù)庫
(1)、一個(gè)復(fù)雜查詢還是多個(gè)簡(jiǎn)單查詢:MYSQL數(shù)據(jù)庫
Mysql內(nèi)部每秒能夠掃描內(nèi)存中上百萬條數(shù)據(jù),相比之下,mysql響應(yīng)數(shù)據(jù)給客戶端就慢得多,在其他條件都相同的時(shí)候,使用盡可能少的查詢當(dāng)然是好的,但有時(shí)候?qū)⒁粋€(gè)大查詢分解為多個(gè)小查詢都是很有需要的.MYSQL數(shù)據(jù)庫
(2)、切分查詢:MYSQL數(shù)據(jù)庫
刪除舊數(shù)據(jù)是一個(gè)很好的例子,在定期清除大量數(shù)據(jù)時(shí),如果用一個(gè)大的語句一次性完成的話,則可能一次鎖住很多數(shù)據(jù),占滿整個(gè)事物日志.耗盡系統(tǒng)資源,阻塞很多小的但很重要的查詢.MYSQL數(shù)據(jù)庫
Mysql>deletefrommessageswherecreated<DATE_SUB(NOW(),INTERVAL3MONTH);
改寫:MYSQL數(shù)據(jù)庫
Rows_affected=0; Do{ Rows_affected=do_query( “deletefrommessageswherecreated<DATE_SUB(NOW(),INTERVAL3MONTH)”; ) }
(3)、分解關(guān)聯(lián)查詢:MYSQL數(shù)據(jù)庫
可以讓緩存的效率更高,在應(yīng)用程序中可以方便的緩存單條數(shù)據(jù)
就查詢分解后,執(zhí)行單個(gè)查詢可以減少鎖的競(jìng)爭(zhēng)
在應(yīng)用層做關(guān)聯(lián),可以更容易對(duì)數(shù)據(jù)庫進(jìn)行拆分,更容易做到高性能和高擴(kuò)展
查詢本身效率也會(huì)更高.
可以減少冗余數(shù)據(jù)的查詢,在應(yīng)用層做關(guān)聯(lián)查詢,意味著對(duì)于某條數(shù)據(jù)應(yīng)用只需要查詢一次,而在數(shù)據(jù)庫中做查詢,可能需要重復(fù)的拜訪一部分?jǐn)?shù)據(jù).MYSQL數(shù)據(jù)庫
適合場(chǎng)景:MYSQL數(shù)據(jù)庫
①當(dāng)應(yīng)用程序能夠便利的緩存單個(gè)查詢結(jié)果的時(shí)候;
②當(dāng)可以將數(shù)據(jù)分布到不同的mysql服務(wù)器上的時(shí)候;
③當(dāng)能夠使用IN()的方式代替關(guān)聯(lián)查詢的時(shí)候;
④當(dāng)查詢中使用一個(gè)數(shù)據(jù)表的時(shí)候.MYSQL數(shù)據(jù)庫
歡迎參與《MYSQL數(shù)據(jù)庫優(yōu)化MySQL數(shù)據(jù)庫中的查詢語句詳解》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/10502.html