巧用變數減少查詢

2021-07-02 01:59:26 字數 2642 閱讀 6566

1:用變數排名

例: 以ecshop中的商品表為例,計算每個欄目下的商品數,並按商品數排名.

select cat_id,count(*)  as cnt from  goods group by cat_id order by cnt desc;
並按商品數計算這些欄目的名次

set @curr_cnt := 0,@prev_cnt := 0, @rank := 0;

select cat_id, (@curr_cnt := cnt) as cnt,

(@rank := if(@curr_cnt <> @prev_cnt,@rank+1,@rank)) as rank,

@prev_cnt := @curr_cnt

from ( select cat_id,count(*) as cnt from shop. goods group by shop. goods.cat_id order by cnt desc) as tmp;

2:用變數計算真正影響的行數

當插入多條,當主鍵重複時,則自動更新,這種效果,可以用insert on duplication for update

要統計真正」新增」的條目, 如下圖,我們想得到的值是」1」,即被更新的行數.

總影響行數-2*實際update數, 即新增的行數.

3: 簡化union

比如有新聞表,news , news_hot, 

new_hot是一張記憶體表,非常快,用來今天的熱門新聞.

首頁取新聞時,邏輯是這樣的:

先取hot, 沒有 再取news,為了省事,用乙個union來完成.

如何利用變數讓後半句select不執行 ,

select id,content,(@find := 1) from news_hot where id=1 //第乙個sql語句會先執行where後面的語句,如果在new_hot找到id=1的記錄,就定義@find變數為1,那麼

//下面的union的子句where id=1 and (@find <= 0)不成立,就不會去查詢news表的內容

union

select id,content,(@find :=1) from news where id=1 and (@find <= 0)

union 1,1,1 where (@find :=null) is not null;//這裡是重新初始化@find變數

3:小心變數的順序

如下圖:變數先在where中發揮作用,然後再是select操作.

如果where不成立,select操作再不發生.

第2例: 

在這個例子中, 1,2兩行,先排好序, 在記憶體中,就是這樣的順序  [2] [1]

再逐行where條件判斷,取值. 

對比這2張圖,分析:

1: where先發揮作用,把需要的行 都給找出

2: 然後再逐行 select

因此, 前者, 最終select時,select@num變數,都是乙個值

後者,不斷select,不斷修改@num的值, 值不斷變化.

同時: 使用變數,將會使sql語句的結果不快取.

C ref,out變數巧用篇

c ref,out變數巧用篇 輸入輸出變數 todo 1,ref型別變數運用 2,out型別變數運用 講解篇 1,ref型別變數 string strref getchangeref ref strref 呼叫 strref變數的值已經改變過了。getchangeref ref string str...

ruby on rails 減少查詢次數

有時間寫 比較粗糙,不管 質量,這樣會造成查詢次數過多的情況 下面幾個方法可盡量避免 1 使用includes 方法及早載入 active record 允許我們提前指明需要載入的所有關聯,這是通過在呼叫model.find時指明includes方法實現的。通過指明includes方法,active...

bash中變數的巧用

鳥哥的私房菜 可以用乙個變數來代替長串的目錄,這樣即好記,也提高了效率。引用如下 若你有乙個常去的工作目錄名稱為 cluster server work taiwan 2005 003 如何 進行該目錄的簡化?答 在一般的情況下,如果你想要進入上述該目錄得要 cd cluster server wo...