sql server insert 锁表_SQL简单优化
網絡搜索概念
1、 避免出現 大小寫不統一的情況
錯誤的寫法:
SELECT id From t where name = 'zhangsan';正確的寫法:
SELECT id FROM t WHERE name = 'zhangsan';在我們看來沒有區別,只是大小寫不一樣而已,但mysql認為是兩個不同的SQL,要進行解析,生成兩個不同的執行計劃。
因此,必須要使相同的查詢語句保持一致。
2、 根據字段類型,調整相應的查詢條件;
比如 age 類型為 int, 那么
錯誤的寫法:
# 這是字符串的寫法,雖然也能查詢出數據,但查詢效率很低。SELECT name FROM t WHERE age = '18';正確的寫法:
SELECT name FROM t WHERE age = 18;3、 避免出現對字段進行NULL的判斷,這個會使MySQL放棄索引進行全表掃描。
錯誤的寫法:
SELECT id FROM t WHERE name IS NULL;這里需要注意的是,在數據庫設計的時候要注意不要給數據庫留NULL, 盡量使用NOT NULL 進行填充,比如: varchar用""填充。
4、 不要使用 SELECT * FROM 查詢,應使用具體的字段查詢,盡量不要返回無用的字段。
5、 WHERE 語句優化:
單獨把WHERE 條件放在一起;
5.1、相同場景的WHERE條件應該相同,例如:
如果創建的所有是 【name,age】,下面的查詢
SELECT id FROM t WHERE name = 'zhangsan' AND age = 18;SELECT id FROM t WHERE age = 19 AND name = 'zhangsan';雖然查詢結果一樣,但第二個查詢肯定會造成索引用不到的情況。
5.2、盡量不要在查詢中用到OR, 如果一個字段有索引,另一個沒有,就會造成全表掃描的。
SELECT id FROM t WHERE num=10 OR name = 'zhangsan';可以這樣寫:
SELECT id FROM t WHERE num = 10UNION ALL SELECT id FROM t WHERE name = 'zhangsan';5.3、盡量不要在WHERE語句中用 != ,<>, 會導致全表掃描
5.4、IN 和 NOT IN 也要注意,否則會導致全表掃描,可以用 EXISTS 代替 IN(當然,前表小于后表時用)
SELECT num FROM a WHERE EXISTS(SELECT 1 FROM b WHERE num=a.num);5.5、避免在WHERE子句中對字段進行操作,包括表達式,函數等。
錯誤的寫法:
SELECT id FROM t WHERE num/2 = 100;正確的寫法:
SELECT id FROM t WHERE num = 100*2;6、 避免使用很復雜的SQL, 如果太復雜,查詢會變慢,并且過幾天你看不懂,別人也看不懂。越簡單的SQL被重用的可能性越高。復雜的SQL只要一個字符發生變化,mysql就會重新去解析。
一般我的查詢嵌套不會超過兩層。
解決辦法:臨時表 暫存中間結果
優點:
1、簡化SQL
2、暫存臨時結果,二次利用,避免多次掃描主表,減少鎖,減少阻塞,提高并發性能。
缺點: 慎重使用臨時表可以極大的提高系統性能(網上說的),這個目前沒有意識到,以后優化的時候可以考慮。
目前我的查詢語句中用到了大量的臨時表,臨時表存儲在內存中,查詢效率顯著提高。
臨時表顯式刪除,先 TERUNCATE table ,然后 DROP table ,這樣可以避免系統表的較長時間鎖表,釋放內存,減少系統開銷。
7、對于多張大數據量的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。
8、進行大量INSERT操作時,先禁用索引,待插入完成后在打開,避免插入的時候進行索引排序。
禁用索引:
ALTER TABLE t DISABLE KEYS;INSERT操作完成后重新打開索引即可:
ALTER TABLE t ENABLE KEYS;三、索引創建
1、盡量使用聯合索引,在常用的字段以及可辨識大的字段上創建索引
2、與WHERE,GROUP BY,ORDER BY 等結合,按順序創建索引,這就需要相同場景的WHERE條件應該相同,因為聚合索引時最左前綴原則,只有WHERE子句順序相同的時候才能用到。
3、不要在每個列上創建索引,索引不要超過五個。
4、不要在建立的索引的數據列上進行下列操作:
避免對索引字段進行計算操作
避免在索引字段上使用not,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出現數據類型轉換
避免在索引字段上使用函數
避免建立索引的列中使用空值。
5、索引的建立要經過嚴格的評估。
四、視圖也可以使用索引
網上大量的文章講視圖不能用到索引,但業務場景必須要用到視圖,就考慮視圖也利用索引。
視圖的建立:避免使用全部建立視圖,應根據業務場景,配合表的索引,創建視圖。不關心視圖用不用到索引,只要我們創建視圖的查詢語句能用到索引,就可以了。
這樣視圖就可以用到索引了,親測有效。
總結
以上是生活随笔為你收集整理的sql server insert 锁表_SQL简单优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js改变css样式_React 中使用C
- 下一篇: android studio放置在函数上