一、一些常見的小失誤
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可能就不應該存在,和業務部門談談,也許他們根本不需要這樣的結果。