mysql查詢-是否請求了不需要的數(shù)據(jù)

對查詢性能影響的因素有很多,下面說說其中的一方面,<b>查詢是否向數(shù)據(jù)庫請求了不需要的數(shù)據(jù)</b>。

有些查詢請求超過實際需要的數(shù)據(jù),這些多余的數(shù)據(jù)會被應(yīng)用丟棄,同時給數(shù)據(jù)庫帶來額外的開銷,比如消耗cpu和內(nèi)存資源等。

1、查詢不需要的記錄

常常有人誤以為mysql只會返回需要的數(shù)據(jù),實際上mysql是先返回全部結(jié)果集再進(jìn)行計算。
??一個簡單的情景,先用select語句查詢大量結(jié)果,然后只獲取前面N條就關(guān)閉結(jié)果集。這樣mysql會查出全部的結(jié)果集,客戶端程序接受全部結(jié)果集,然后拋棄其中大部分?jǐn)?shù)據(jù)。最簡單有效的解決方法是在查詢后面加上limit。

2、多表關(guān)聯(lián)時返回全部列

在關(guān)聯(lián)查詢時,總是返回全部列,而有些表的列并不是我們需要的數(shù)據(jù)。

例如下面的一個查詢電影Academy Dinosaur中出現(xiàn)的演員,千萬不要用下面的寫法。

mysql> select * from actor
->inner join film_actor using(actor_id)
->inner join film using(film_id)
-> where film.title = 'Academy Dinosaur';

這將返回三個表的全部數(shù)據(jù)列。正確的方式是只取需要的列:

select actor.* from actor...;

3、總是取出全部列

每當(dāng)我們看到select * 的時候,都要用懷疑的眼光審視。取出全部列,會讓優(yōu)化器無法完成索引覆蓋掃描這類優(yōu)化,同時為服務(wù)器帶來額外的I/O、內(nèi)存和cpu的消耗。所以大多數(shù)情況只取需要的列。

當(dāng)然特殊的情況也是有的,查詢返回超過需要的數(shù)據(jù)也不總是壞事。比如有些能提高代碼片段復(fù)用性的語句,這樣能夠簡化開發(fā),雖然浪費了點數(shù)據(jù)庫資源。同時在涉及到緩存時,獲取并緩存所有的列,相比多個獨立獲取部分列的查詢可能更好。這些都是由具體的應(yīng)用場景所決定的。

4、重復(fù)查詢相同的數(shù)據(jù)

一不小心,我么就會有這樣的錯誤——重復(fù)執(zhí)行相同的查詢,每次都返回相同的數(shù)據(jù)。

例如,在用戶評論的地方需要查詢用戶頭像的url,當(dāng)用戶多次評論時,就會反復(fù)查詢這個數(shù)據(jù)。解決方法是初次查詢時將這個數(shù)據(jù)緩存起來,需要的時候從緩存中取。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容