MYSQL-謹慎使用 select * ?

MYSQL-謹慎使用 select * ?

      

       每次在寫SELECT查詢語句的時候,都需要用懷疑的眼光審視,是不是真的需要返回全部的列,確定要使用SELECT * FROM?是否確實需要返回全部結果集,確定不加LIMIT限制?

      下面對這些情況加以解析和說明,僅供參考。

 

錯誤方式:

     select * from TblA;

     這將取出表的全部列,會讓MYSQL優化器無法完成索引覆蓋掃描這類優化,還會爲服務器帶來額外的I/O,內存和CPU的消耗。造成系統的延遲的重頭戲是網絡開銷,網絡開銷可能帶來秒級的延遲,select * 會查詢出不需要的、額外的數據,那麼這些額外的數據在網絡上進行傳輸,必定會造成性能延遲。假設你的table中,有一些列的類型爲BLOB,TEXT等,此時,你的select *操作,就會更加緩慢,並且會造成額外的網絡開銷。

正確方式:

    select col1 from TblA LIMIT 10;

    在col1字段有索引的情況下,mysql是可以不用讀data,直接使用index裏面的值就返回結果的。但是一旦用了select *,就會有其他列需要讀取,這時在讀完index以後還需要去讀data纔會返回結果。這樣就造成了額外的性能開銷。如果不需要全部結果集顯示,最好根據實際情況在查詢後面加上LIMIT,這樣MYSQL就不會查詢出全部的結果集了。

 

 

錯誤方式二:

select * from TblA

inner join TblB USING(A_ID)

inner join TblC USING(B_ID)

WHERE TblA.id = ?;

 

這種方式將返回三個表的全部數據列,正確的方法是應該指定只取需要的某些列名稱,如:

select TblA .col1,TbleB.col2  from TblA

inner join TblB USING(A_ID)

inner join TblC USING(B_ID)

WHERE TblA.ID = ?;

 

總之,查詢超過實際需要的數據,然後這些多餘的數據會被應用程序拋棄,這會給MYSQL服務器帶來額外的福大,並增加網絡開銷,同時也會消耗應用服務器的CPU和內存資源。

 

當然有的人會覺得使用select * ,這樣在增加列的時候,不用改sql語句,可以簡化開發,可提高相同代碼片段的複用性。但是如果你select 指定列,只獲取自己需要的幾列,表結構的修改,對你代碼的影響就會小很多,另外對於其他接手你項目的人來說,看到select 指定列的方式,可讀性更強,對於他們來說更好理解!所以,謹慎使用select * from!


備註:實戰示例,解疑答惑。

           --不間端地思考,實時地批判你的工作!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章