午夜精品人妻久久久-成年美女很黄的网站-在线看片免费人成视久网app-国产精品美女无遮挡一区二区-91精品国产综合久久久久-国产的免费视频又猛又爽又刺激-在线看片免费人成视久网app-久久香蕉国产精品视频-av一区二区三区高清

SQL語句優(yōu)化匯總

查詢SQL盡量不要使用 *,而是具體字段
反例
select * from test
正例
select id,name,age,remark from test
理由
節(jié)省資源、減少網(wǎng)絡(luò)開銷 。
可能用到覆蓋索引,減少回表,提高查詢效率 。
避免在where子句中使用 or 來連接條件
反例
select* from test whereid=1 or age>20
正例
使用union all
select* from test whereid=1 union allselect* from test where age>20
理由
使用or可能會(huì)使索引失效,從而全表掃描;
雖然mysql是有優(yōu)化器的,出于效率與成本考慮,遇到or條件,索引還是可能失效的;
盡量使用數(shù)值替代字符串類型
正例
理由
因?yàn)橐嬖谔幚聿樵兒瓦B接時(shí)會(huì)逐個(gè)比較字符串中每一個(gè)字符;
而對于數(shù)字型而言只需要比較一次就夠了;
字符會(huì)降低查詢和連接的性能 , 并會(huì)增加存儲(chǔ)開銷;
使用代替char
理由
1、char的長度是固定的,而的長度是可以變化的 。
例如:存儲(chǔ)字符串“101”,對于char(10),表示你存儲(chǔ)的字符將占10個(gè)字節(jié)(包括7個(gè)空字符),在數(shù)據(jù)庫中它是以空格占位的,而同樣的(10)則只占用3個(gè)字節(jié)的長度,10只是最大值 , 當(dāng)你存儲(chǔ)的字符小于10時(shí),按實(shí)際長度存儲(chǔ) 。
2、char的效率比的效率稍高 。
比char節(jié)省空間,在效率上比char會(huì)稍微差一點(diǎn),既想獲取效率收獲不止sql優(yōu)化pdf , 就必須犧牲一點(diǎn)空間,這就是我們在數(shù)據(jù)庫設(shè)計(jì)上常說的“以空間換效率” 。
where中使用默認(rèn)值代替null
反例
select * from test where age is not null
正例
select * from test where age > 0
理由
where語句中索引列使用了負(fù)向查詢,可能會(huì)導(dǎo)致索引失效
負(fù)向查詢包括:NOT、!=、、!、NOT IN、NOT LIKE等
負(fù)向查詢應(yīng)盡量避免出現(xiàn) 。否則引擎將放棄使用索引而進(jìn)行全表掃描
避免在where子句中使用!=或操作符

SQL語句優(yōu)化匯總

文章插圖
SQL語句優(yōu)化匯總

文章插圖
inner join 、left join、right join,優(yōu)先使用inner join
三種連接如果結(jié)果相同,優(yōu)先使用inner join,如果使用left join左邊表盡量小
理由
清空表時(shí)優(yōu)先使用
table在功能上與不帶where子句的 語句相同:二者均刪除表中的全部行 。但table比 速度快,且使用的系統(tǒng)和事務(wù)日志資源少 。
語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項(xiàng) 。table通過釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁的釋放 。
table刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變 。新行標(biāo)識所用的計(jì)數(shù)值重置為該列的種子 。如果想保留標(biāo)識計(jì)數(shù)值,請改用。如果要?jiǎng)h除表定義及其數(shù)據(jù) , 請使用 drop table語句 。
避免在索引列上使用內(nèi)置函數(shù)
使用索引列上內(nèi)置函數(shù),索引失效
like通配符可能會(huì)導(dǎo)致索引失效MySQL優(yōu)化器的最終選擇,不走索引
即使完全符合索引生效的場景 , 考慮到實(shí)際數(shù)據(jù)量等原因,最終是否使用索引還要看MySQL優(yōu)化器的判斷 。當(dāng)然你也可以在sql語句中寫明強(qiáng)制走某個(gè)索引 。
使用分析你SQL執(zhí)行計(jì)劃
type
Extra常用關(guān)鍵字
總結(jié)其它優(yōu)化方式
1、 設(shè)計(jì)表的時(shí)候,所有表和字段都添加相應(yīng)的注釋 。
2、SQL書寫格式,關(guān)鍵字大小保持一致,使用縮進(jìn) 。
3、 修改或刪除重要數(shù)據(jù)前,要先備份 。
4、 很多時(shí)候用代替 in 是一個(gè)好的選擇
5、where后面的字段,留意其數(shù)據(jù)類型的隱式轉(zhuǎn)換 。(字符串和整數(shù) “100” 100)
6、 盡量把所有列定義為NOT NULL
NOT NULL列更節(jié)省空間 , NULL列需要一個(gè)額外字節(jié)作為判斷是否為 NULL的標(biāo)志位 。NULL列需要注意空指針問題,NULL列在計(jì)算和比較的時(shí)候,需要注意空指針問題 。
7、 偽刪除設(shè)計(jì)
8、 數(shù)據(jù)庫和表的字符集盡量統(tǒng)一使用UTF8
(1)可以避免亂碼問題;
(2)可以避免,不同字符集比較轉(zhuǎn)換,導(dǎo)致的索引失效問題;
9、 count(*) from table;
這樣不帶任何條件的count會(huì)引起全表掃描,并且沒有任何業(yè)務(wù)意義,是一定要杜絕的 。
10、 避免在where中對字段進(jìn)行表達(dá)式操作
(1)SQL解析時(shí) , 如果字段相關(guān)的是表達(dá)式就進(jìn)行全表掃描 ;
(2)字段干凈無表達(dá)式收獲不止sql優(yōu)化pdf,索引生效;
11、 關(guān)于臨時(shí)表
(1)避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗;
(2)在新建臨時(shí)表時(shí),如果一次性插入數(shù)據(jù)量很大 , 那么可以使用into 代替table,避免造成大量 log;
(3)如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應(yīng)先 table,然后;
(4)如果使用到了臨時(shí)表 , 在存儲(chǔ)過程的最后務(wù)必將所有的臨時(shí)表顯式刪除 。先table,然后 drop table ,這樣可以避免系統(tǒng)表的較長時(shí)間鎖定;
12、 索引不適合建在有大量重復(fù)數(shù)據(jù)的字段上,比如性別,排序字段應(yīng)創(chuàng)建索引
13、 去重過濾字段要少
14、 盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力
15、 所有表必須使用存儲(chǔ)引擎
【SQL語句優(yōu)化匯總】本文到此結(jié)束,希望對大家有所幫助 。