sql server insert 锁表_SQL简单优化
網(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js改变css样式_React 中使用C
- 下一篇: android studio放置在函数上