日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

sql server insert 锁表_SQL简单优化

發布時間:2025/3/21 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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简单优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。