對於count(列)來說,評估列中每一行的值是否為null,如果為null則不計數,不為null則計數。因此count(列)會計算列或這列的組合不為空的計數。
count(*)的規則是,找一列not null的列,如果該列有索引,則使用該索引,當然,為了效能,sql server會選擇最窄的索引以減少io。
count(*)只是返回表中行數,因此sql server在處理count(*)的時候只需要找到屬於表的資料塊塊頭,然後計算一下行數就行了,而不用去讀取裡面資料列的資料。
而對於count(col)就不一樣了,為了去除col列中包含的null行,sql server必須讀取該col的每一行的值,然後確認下是否為null,然後在進行計數。因此count(*)應該是比count(col)快的
在不加where限制
條件的情況下,count(*)與count(col)基本可以認為是等價的;
所以,如果不影響邏輯,用count(*)效率最高,如果需要判斷某列不能為null則必須用count(col)。
一般來說能用in盡量不用or,如果所在列有索引或者主鍵效能沒啥差別,如果沒有索引,in的效率會高很多;
select * from a where id in(select id from b)和select a.* from a a where exists(select 1 from b b where a.id=b.id)
exists()適合b錶比a表資料大的情況,in則相反。
入參是"or 1 = 1;drop table -- ",通過or可以繞過驗證,分號並最後雙橫桿能執行任意sql,危害很大。
解決辦法:
MySQL開發規範與使用技巧總結
1.庫名 表名 欄位名必須使用小寫字母,並採用下劃線分割。2.庫名 表名 欄位名禁止超過32個字元。3.使用innodb儲存引擎。4.庫名 表名 欄位名禁止使用mysql保留字。5.禁止使用分割槽表。6.建議使用unsigned儲存非負數值。7.建議使用int unsigned儲存ipv4。sele...
mysql開發經驗 MySql開發經驗
1 wait timeout 預設288800秒 8小時 jdbc連線池maxwait或者maxldeltime這兩個引數要小於這個值,否則,當你的連線長時間沒和資料庫互動,伺服器早就把你的連線斷開了,而你的連線池還認為是有效連線,除非你設定testonborrow或者設定testonreturn設...
mysql開發經驗 MySql開發經驗
1 wait timeout 預設288800秒 8小時 jdbc連線池maxwait或者maxldeltime這兩個引數要小於這個值,否則,當你的連線長時間沒和資料庫互動,伺服器早就把你的連線斷開了,而你的連線池還認為是有效連線,除非你設定testonborrow或者設定testonreturn設...