日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sql server insert 锁表_SQL简单优化

發(fā)布時(shí)間:2025/3/21 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql server insert 锁表_SQL简单优化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)絡(luò)搜索概念

1、 避免出現(xiàn) 大小寫不統(tǒng)一的情況

錯(cuò)誤的寫法:

SELECT id From t where name = 'zhangsan';

正確的寫法

SELECT id FROM t WHERE name = 'zhangsan';

在我們看來沒有區(qū)別,只是大小寫不一樣而已,但mysql認(rèn)為是兩個(gè)不同的SQL,要進(jìn)行解析,生成兩個(gè)不同的執(zhí)行計(jì)劃。

因此,必須要使相同的查詢語句保持一致。

2、 根據(jù)字段類型,調(diào)整相應(yīng)的查詢條件

比如 age 類型為 int, 那么

錯(cuò)誤的寫法

# 這是字符串的寫法,雖然也能查詢出數(shù)據(jù),但查詢效率很低。SELECT name FROM t WHERE age = '18';

正確的寫法

SELECT name FROM t WHERE age = 18;

3、 避免出現(xiàn)對(duì)字段進(jìn)行NULL的判斷,這個(gè)會(huì)使MySQL放棄索引進(jìn)行全表掃描。

錯(cuò)誤的寫法

SELECT id FROM t WHERE name IS NULL;

這里需要注意的是,在數(shù)據(jù)庫設(shè)計(jì)的時(shí)候要注意不要給數(shù)據(jù)庫留NULL, 盡量使用NOT NULL 進(jìn)行填充,比如: varchar用""填充。

4、 不要使用 SELECT * FROM 查詢,應(yīng)使用具體的字段查詢,盡量不要返回?zé)o用的字段。

5、 WHERE 語句優(yōu)化:

單獨(dú)把WHERE 條件放在一起;

5.1、相同場景的WHERE條件應(yīng)該相同,例如:

如果創(chuàng)建的所有是 【name,age】,下面的查詢

SELECT id FROM t WHERE name = 'zhangsan' AND age = 18;SELECT id FROM t WHERE age = 19 AND name = 'zhangsan';

雖然查詢結(jié)果一樣,但第二個(gè)查詢肯定會(huì)造成索引用不到的情況。

5.2、盡量不要在查詢中用到OR, 如果一個(gè)字段有索引,另一個(gè)沒有,就會(huì)造成全表掃描的。

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語句中用 != ,<>, 會(huì)導(dǎo)致全表掃描

5.4、IN 和 NOT IN 也要注意,否則會(huì)導(dǎo)致全表掃描,可以用 EXISTS 代替 IN(當(dāng)然,前表小于后表時(shí)用)

SELECT num FROM a WHERE EXISTS(SELECT 1 FROM b WHERE num=a.num);

5.5、避免在WHERE子句中對(duì)字段進(jìn)行操作,包括表達(dá)式,函數(shù)等。

錯(cuò)誤的寫法

SELECT id FROM t WHERE num/2 = 100;

正確的寫法

SELECT id FROM t WHERE num = 100*2;

6、 避免使用很復(fù)雜的SQL, 如果太復(fù)雜,查詢會(huì)變慢,并且過幾天你看不懂,別人也看不懂。越簡單的SQL被重用的可能性越高。復(fù)雜的SQL只要一個(gè)字符發(fā)生變化,mysql就會(huì)重新去解析。

一般我的查詢嵌套不會(huì)超過兩層。

解決辦法:臨時(shí)表 暫存中間結(jié)果

優(yōu)點(diǎn)

1、簡化SQL

2、暫存臨時(shí)結(jié)果,二次利用,避免多次掃描主表,減少鎖,減少阻塞,提高并發(fā)性能。

缺點(diǎn): 慎重使用臨時(shí)表可以極大的提高系統(tǒng)性能(網(wǎng)上說的),這個(gè)目前沒有意識(shí)到,以后優(yōu)化的時(shí)候可以考慮。

目前我的查詢語句中用到了大量的臨時(shí)表,臨時(shí)表存儲(chǔ)在內(nèi)存中,查詢效率顯著提高。

臨時(shí)表顯式刪除,先 TERUNCATE table ,然后 DROP table ,這樣可以避免系統(tǒng)表的較長時(shí)間鎖表,釋放內(nèi)存,減少系統(tǒng)開銷。

7、對(duì)于多張大數(shù)據(jù)量的表JOIN,要先分頁再JOIN,否則邏輯讀會(huì)很高,性能很差。

8、進(jìn)行大量INSERT操作時(shí),先禁用索引,待插入完成后在打開,避免插入的時(shí)候進(jìn)行索引排序。

禁用索引:

ALTER TABLE t DISABLE KEYS;

INSERT操作完成后重新打開索引即可:

ALTER TABLE t ENABLE KEYS;

三、索引創(chuàng)建

1、盡量使用聯(lián)合索引,在常用的字段以及可辨識(shí)大的字段上創(chuàng)建索引

2、與WHERE,GROUP BY,ORDER BY 等結(jié)合,按順序創(chuàng)建索引,這就需要相同場景的WHERE條件應(yīng)該相同,因?yàn)榫酆纤饕龝r(shí)最左前綴原則,只有WHERE子句順序相同的時(shí)候才能用到。

3、不要在每個(gè)列上創(chuàng)建索引,索引不要超過五個(gè)。

4、不要在建立的索引的數(shù)據(jù)列上進(jìn)行下列操作:

避免對(duì)索引字段進(jìn)行計(jì)算操作

避免在索引字段上使用not,<>,!=

避免在索引列上使用IS NULL和IS NOT NULL

避免在索引列上出現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換

避免在索引字段上使用函數(shù)

避免建立索引的列中使用空值。

5、索引的建立要經(jīng)過嚴(yán)格的評(píng)估。

四、視圖也可以使用索引

網(wǎng)上大量的文章講視圖不能用到索引,但業(yè)務(wù)場景必須要用到視圖,就考慮視圖也利用索引。

視圖的建立:避免使用全部建立視圖,應(yīng)根據(jù)業(yè)務(wù)場景,配合表的索引,創(chuàng)建視圖。不關(guān)心視圖用不用到索引,只要我們創(chuàng)建視圖的查詢語句能用到索引,就可以了。

這樣視圖就可以用到索引了,親測有效。

總結(jié)

以上是生活随笔為你收集整理的sql server insert 锁表_SQL简单优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。