優(yōu)化MySQL數(shù)據(jù)庫中的查詢語句詳解
很多時候基于php+MySQL建立的網(wǎng)站所出現(xiàn)的系統(tǒng)性能瓶頸往往是出在MySQL上,而MySQL中用的最多的語句就是查詢語句,因此,針對MySQL數(shù)據(jù)庫查詢語句的優(yōu)化就顯得至關重要!本文就此問題做出詳細分析如下:
1、判斷是否向MySQL數(shù)據(jù)庫請求了不需要的數(shù)據(jù),如下列情況:
(1)、查詢不需要的數(shù)據(jù),例如你需要10條數(shù)據(jù),但是你選出了100條數(shù)據(jù)加了limit做限制。
(2)、多表關聯(lián)時返回全部列
(3)、總是取出全部列select*......取出全部列,會讓優(yōu)化器無法完成索引覆蓋掃描這類優(yōu)化,還為服務器帶來額外的I/O、內(nèi)存、和cpu的消耗
(4)、重復查詢相同的數(shù)據(jù)例如,在用戶評論的地方需要查詢用戶的頭像的URL,那么用戶多次評論的時候?qū)⑦@個數(shù)據(jù)緩存起來,需要的時候從緩存取出,這樣性能會更好。
2、mysql是否在掃描額外的記錄
最簡單衡量查詢開銷的三個指標如下:響應時間、掃描的行數(shù)、返回的行數(shù)
響應時間:服務時間和排隊時間。服務時間是指數(shù)據(jù)庫處理這個查詢真正花費的時間。排隊時間是指服務器因為等待某些資源而沒有真正執(zhí)行的查詢。
掃描的行數(shù)和返回的行數(shù):理想情況下掃描的行數(shù)和返回的行數(shù)應該是相同的。
一般MYSQL能夠使用如下三種方式應用where條件記錄,從好到壞依次為:
(1)、在索引中使用where條件來過濾不匹配的記錄,在存儲索引層完成。
(2)、使用索引覆蓋掃描來返回記錄,直接從索引中過濾不需要的記錄并返回命中的結果,在mysql服務器層完成,但無需在回表查詢記錄。
(3)、從數(shù)據(jù)表中返回數(shù)據(jù),然后過濾不滿足條件的記錄,在mysql服務器層完成,需要先從數(shù)據(jù)表讀出記錄然后過濾
如果發(fā)現(xiàn)查詢需要掃描大量的數(shù)據(jù)但返回少數(shù)的行,那么通??梢試L試下面的技巧:
(1)、使用索引覆蓋掃描,把所有需要的列都放到索引中,這樣存儲引擎無須返回表獲取對應行就可以返回結果了。
(2)、改變庫表結構,使用單獨的匯總表。
(3)、重寫這個復雜的查詢
3、重構查詢的方式
(1)、一個復雜查詢還是多個簡單查詢:
Mysql內(nèi)部每秒能夠掃描內(nèi)存中上百萬條數(shù)據(jù),相比之下,mysql響應數(shù)據(jù)給客戶端就慢得多,在其他條件都相同的時候,使用盡可能少的查詢當然是好的,但有時候?qū)⒁粋€大查詢分解為多個小查詢都是很有必要的。
(2)、切分查詢:
刪除舊數(shù)據(jù)是一個很好的例子,在定期清除大量數(shù)據(jù)時,如果用一個大的語句一次性完成的話,則可能一次鎖住很多數(shù)據(jù),占滿整個事物日志。耗盡系統(tǒng)資源,阻塞很多小的但很重要的查詢。
Mysql>deletefrommessageswherecreated<DATE_SUB(NOW(),INTERVAL3MONTH);
改寫:
Rows_affected=0; Do{ Rows_affected=do_query( “deletefrommessageswherecreated<DATE_SUB(NOW(),INTERVAL3MONTH)”; ) }
(3)、分解關聯(lián)查詢:
可以讓緩存的效率更高,在應用程序中可以方便的緩存單條數(shù)據(jù)
就查詢分解后,執(zhí)行單個查詢可以減少鎖的競爭
在應用層做關聯(lián),可以更容易對數(shù)據(jù)庫進行拆分,更容易做到高性能和高擴展
查詢本身效率也會更高。
可以減少冗余數(shù)據(jù)的查詢,在應用層做關聯(lián)查詢,意味著對于某條數(shù)據(jù)應用只需要查詢一次,而在數(shù)據(jù)庫中做查詢,可能需要重復的訪問一部分數(shù)據(jù)。
適合場景:
①當應用程序能夠方便的緩存單個查詢結果的時候;
②當可以將數(shù)據(jù)分布到不同的mysql服務器上的時候;
③當能夠使用IN()的方式代替關聯(lián)查詢的時候;
④當查詢中使用一個數(shù)據(jù)表的時候。
相關文章
SQL常見函數(shù)整理之Format將日期、時間和數(shù)字值格式化
最近項目總是寫sql查詢時間,數(shù)據(jù)庫存的時間有各種格式,下面這篇文章主要給大家介紹了關于SQL常見函數(shù)整理之Format將日期、時間和數(shù)字值格式化的相關資料,需要的朋友可以參考下2024-01-01MySQL?8.0新特性之集合操作符INTERSECT和EXCEPT
MySQL8.0.31版本開始支持了INTERSECT(交集)和EXCEPT(差集)運算,INTERSECT返回兩個結果集中都包含的行,EXCEPT返回左側結果集存在,右側不存在的行,這篇文章主要給大家介紹了關于MySQL?8.0新特性之集合操作符INTERSECT和EXCEPT的相關資料,需要的朋友可以參考下2022-10-10MySQL數(shù)據(jù)庫定時備份的實現(xiàn)方法
這篇文章主要介紹了MySQL數(shù)據(jù)庫的定時備份的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04MySQL?原理與優(yōu)化之Limit?查詢優(yōu)化
這篇文章主要介紹了MySQL?原理與優(yōu)化之Limit?查詢優(yōu)化,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08CentOS系統(tǒng)中MySQL5.1升級至5.5.36
有相關測試數(shù)據(jù)說明從5.1到5.5+,MySQL性能會有明顯的提升,具體的需要自己建立測試環(huán)境去實踐下,今天我們就來操作下,并記錄下來升級的具體步驟2017-07-07