mysql開發總結

2021-08-14 13:05:00 字數 803 閱讀 4928

對於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設...