每次在寫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!
備註:實戰示例,解疑答惑。
--不間端地思考,實時地批判你的工作!
謹慎使用viewWithTag
uilabel cl title self viewwithtag 101 cl title.text infos total time uilabel cl distance self viewwithtag 102 cl distance.text infos distance uilabel ...
My SQL 使用SELECT檢索資料
為了使用select檢索表,必須提供兩個條件 想選擇什麼和從 選擇。在這裡我們假設有一張表,名為products,內容如下 常用的檢索命令和舉例如下 檢索某一列 select語句檢索資料是無序的,因此可能每次檢索的結果順序不一致 select prod name from products 結果如下...
對於drawRect使用,謹慎使用
1.drawrect簡介 drawrect方法在uiview的使用上起著十分關鍵的作用。不知道大家注意過沒有,每一次建立uiview子類檔案時候,會有自動帶有已注釋的drawrect方法,也許從這一點就能看出這個方法的重要性。該方法定義在uiview uiviewrendering 分類裡面,望文生...