最近一直在忙校招的事情,所以一直沒有及時更新文章,,今天我們來聊一聊一個經(jīng)典的問題,,Mysql的字段,為什么要盡量設置成非空,。 Mysql這條潛規(guī)則,,很多人都覺得時以訛傳訛,,三人成虎,實際上,,在Mysql官網(wǎng)上,,也是對這一項也是有特別的說明,說Mysql中的Null字段,需要額外的設置1個bit進行表示,。 很多程序員都認為,,這條規(guī)則可能會造成mysql的性能降低, 其實不然,,我認為真正的原因,,應該是這種數(shù)據(jù)使用起來非常容易挖坑。很多時候,,如果sql寫得不規(guī)范,容易造成數(shù)據(jù)沒有被篩選出來,。 我記得幾年前,,還在一家創(chuàng)業(yè)公司的時候,公司發(fā)生這樣一個案例,。有一次交易系統(tǒng)出了故障,,造成一些訂單的沒有贈品的數(shù)據(jù)錯誤,這個時候就想從數(shù)據(jù)庫里面撈出數(shù)據(jù)補償用戶,,結果訂單狀態(tài)這種核心字段竟然可以為空,,加上操作者又是一個新人寫得數(shù)據(jù)庫查詢sql不規(guī)范,導致很多訂單都沒有篩選出來,,加上微博本已發(fā)出補償公告,,造成更大的用戶投訴。 那么,,這種為空的數(shù)據(jù)庫列,,篩選有什么坑呢? !=不等于查詢異常 舉個簡單的例子,,我們有一堆用戶的基本數(shù)據(jù),,男生設置為1,女生設置為2,,未知設置為空,,當我們使用數(shù)據(jù)庫查詢語句,使用不等于的方式查詢女生,,最后只能夠把男生篩選出來,,而不能把未知的篩選出來。 最好的方法,,就是把位置的默認設置為0,。同樣,,使用not in等sql語法,也有同樣的問題,。 使用contact的時候異常 我們經(jīng)常會用數(shù)據(jù)庫存一些用戶的收貨地址,,有時候會使用數(shù)據(jù)庫的contact進行地址的拼接,例如數(shù)據(jù)庫里面存在省份,、城市,、詳細收貨地址等字段,如果其中某一個為NULL的話,,那么最終拼接出來的結果,,也會是NULL。從而達不到預期的效果,。 使用count可能有異常 如果我們使用count(字段名),,如果這個字段剛好為空的時候,就不會被統(tǒng)計進去,。 總結既然mysql的設置為空這么坑,,我們需要怎么應對呢,?首先,當我們查詢?yōu)榭盏淖侄问?,要使?strong>IS NULL,。上述例子,查詢非女生的用戶,,我們就需要指定不等于2或者為空的字段,。 不過更重要的是,,如果不是特殊需求,,我們盡可能的不要設置字段為空,雖然設置為空對性能的影響不大,,但是,,特別容易挖坑,畢竟程序員是一個團隊協(xié)作的工作,,少一些潛規(guī)則,,少一些機關,頭發(fā)會多一些,。 |
|