關于SQL有什么技巧分享?
通常我們的SQL都是寫在代碼中的,執行一次SQL需要經歷網絡傳輸、SQL的執行、如果是查詢操作,會有查詢結果返回,再每一個步驟中,都需要注意效率問題。(第二部分會著重說SQL的一些經驗)
減少數據訪問(減少磁盤訪問) :使用索引;
返回更少數據(減少網絡傳輸或磁盤訪問) :數據分頁處理、只返回需要的字段;
減少交互次數(減少網絡傳輸) :批量執行、使用存儲過程;
減少服務器CPU開銷(減少CPU及內存開銷):使用綁定變量、合理使用排序、減少比較操作、大量復雜運算在客戶端處理;
利用更多資源(增加資源)。
既然題目中問到了SQL,還是主要說一下SQL的一些技巧,主要是索引的使用。
B-Tree索引:說到數據庫的索引,大多數時候都是指B-Tree索引,B-Tree索引適用于全鍵值、范圍、前綴的查找;主鍵、外鍵必須有索引,當然很多系統都是邏輯外鍵(或需要經常和其他表關聯),也需要建立索引;經常出現在where、order by、group by中的字段;盡量把索引建立到小字段上;對于文本字段或者很長字段,不要建索引;
聯合索引:也是B-Tree索引,這里單獨拿出來強調一下【聯合索引的最左原則】,如果不是按索引的最左列查找,那么將無法使用索引。最左原則:如果創建了一個聯合索引(name,age,gender),相當于創建了三個索引(name)、(name,age)、(name,age,gender)。聯合索引,左邊的列有范圍查找,那么右邊的列無法使用索引。比如index(age,gender),where age > 20 and gender = 'M';這時候就會有問題。解決辦法也很簡單,兩個字段分別建立索引。
哈希索引:是基于哈希表,精確匹配索引所有列的查詢才有效;
全文索引、聚簇索引、聚簇索引等等,就不詳細說了,因為...我也不太會,幾乎沒有用過。
索引的一些小技巧前導模糊查詢,會導致索引失效:where name like '%XX';
數據區分度不大,不建議使用索引:where gender = 'M';性別只有男、女、未知三種;
等號左邊有函數,會索引失效:where LENGTH(col1) = 10;
隱式轉換的問題:where col2 = '100',col2列是數字,等號左右類型不一致,col2會隱式轉換成字符串;
盡量不好使用負向查詢,例如:!=、not in、not exists;
單列索引不存null值,復合索引不存全為null的值(索引列盡量使用not null的約束并設置默認值);
索引不是越多越好。
我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。