sql初學習中常見的失誤

一、一些常見的小失誤

1 標點符號

 select 字段時忘記寫逗號

正確sql: select a,b from table

錯誤sql:select  a b from table

要命的是這個sql並不報語法錯誤,本想取兩個字段,結果是取了一個字段a,別名爲b,有時候你查了半天爲什麼數據不對,結果是漏掉一個分號所致。

中英文符號差異——不能正確編譯

這個錯誤很容易出現,包括全角符字符,又不容易發現。當出現編譯問題的時候應該首先看看 自己語法字符上有沒有問題

2 delete只寫了字段,沒有寫完整條件

正確sql: delete from table where a = 1

錯誤sql:delete from table where a

上面的錯誤sql也不報語法錯誤,但是後果很嚴重,直接把所有的數據刪掉。所以delete的時候一定要小心,同時建議delete時加上limit和更多確定的條件,這樣增加一點點保險。

3 update時條件不完整

正確sql:update table table1, table2 set table1.a = ‘…’ where table2.join = table1.join and table2.b = ‘**’

錯誤sql:  update table table1, table2 set table1.a = ‘…’ where table2.b = ‘**’

上面的錯誤sql殺傷力也是很大的,直接將table1的數據都修改一遍,我們同事就犯過這個錯誤,最後大家修數據修的快掛了。

4 select join時,字段寫錯

正確sql : select table1.a, table2.b from table1 inner join table2 on table1.join = table2.join

錯誤sql:select table1.a, table2.b from table1 inner join table2 on table1.join = table1.join

注意後面的條件是同一個表的字段相等,這在任何情況下都是true,這樣的話,內連接直接變成笛卡爾乘積,如果兩個大表,系統直接掛掉,我犯過此錯誤,在測試環境上數據少,沒仔細看結果,沒有發現問題,上到正式環境上,mysql直接掛掉。

5 時間沒有加單引號

正確sql:select a from table1 where d > ’2011-03-11′

錯誤sql: select a from table1 where d > 2011-03-11

你會發現錯誤的sql後面的結果過濾沒有達到你期望的結果。


下面是自己總結的一些tips

1 合理的表結構

核心表中避免存大數據,允許合理的冗餘數據存在。

2 加索引

這是最簡單的辦法,大部分情況下,是沒有加索引,或者索引做的不對。是否該加索引,explain一下就知道了。

3 避免join的字段類型不對

同樣的屬性,在不同表裏面保存的類型不一樣,join完全無法使用索引,這時候如果無法對目前的表結構修改,可以使用cast作爲暫時的解決方案。另外,join時,確保兩個字段的確是同一個屬性也非常重要,我們之前就犯過userId = user_id這樣的低級錯誤,不但速度慢,而且結果也不對。

4 根據目前的條件,推導出更加有效的條件

如,根據實際需求有以下sql: select a.field1, b.field2 from a inner join b on a.join = b.join where {conditona}

如果你能夠通過a表上的一條限制條件 {conditiona} 推導出一個b表上的限制條件{conditionb},而 {conditionb} 又能夠明顯減少查詢的記錄或者能夠有效的使用索引,那麼加上{conditionb}後的效果是非常顯著的。

5 要多看看plan的結果

即使同一個條件,條件裏面的取值不一樣,plan出來的結果也是不一樣的。

當然,在數據量非常大時,explain的結果即使看起來很美好,但也可能很慢。

6 業務上的,去掉返回大數據量的需求

當一條sql要返回幾十萬或者更多的數據給用戶看,這sql可能就不應該存在,和業務部門談談,也許他們根本不需要這樣的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章