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

文章插圖

文章插圖
inner join 、left join、right join,優先使用inner join
三種連接如果結果相同,優先使用inner join,如果使用left join左邊表盡量小
理由
清空表時優先使用
table在功能上與不帶where子句的 語句相同:二者均刪除表中的全部行 。但table比 速度快,且使用的系統和事務日志資源少 。
語句每次刪除一行,并在事務日志中為所刪除的每行記錄一項 。table通過釋放存儲表數據所用的數據頁來刪除數據,并且只在事務日志中記錄頁的釋放 。
table刪除表中的所有行,但表結構及其列、約束、索引等保持不變 。新行標識所用的計數值重置為該列的種子 。如果想保留標識計數值,請改用。如果要刪除表定義及其數據 , 請使用 drop table語句 。
避免在索引列上使用內置函數
使用索引列上內置函數,索引失效
like通配符可能會導致索引失效MySQL優化器的最終選擇,不走索引
即使完全符合索引生效的場景 , 考慮到實際數據量等原因,最終是否使用索引還要看MySQL優化器的判斷 。當然你也可以在sql語句中寫明強制走某個索引 。
使用分析你SQL執行計劃
type
Extra常用關鍵字
總結其它優化方式
1、 設計表的時候,所有表和字段都添加相應的注釋 。
2、SQL書寫格式,關鍵字大小保持一致,使用縮進 。
3、 修改或刪除重要數據前,要先備份 。
4、 很多時候用代替 in 是一個好的選擇
5、where后面的字段,留意其數據類型的隱式轉換 。(字符串和整數 “100” 100)
6、 盡量把所有列定義為NOT NULL
NOT NULL列更節省空間 , NULL列需要一個額外字節作為判斷是否為 NULL的標志位 。NULL列需要注意空指針問題,NULL列在計算和比較的時候,需要注意空指針問題 。
7、 偽刪除設計
8、 數據庫和表的字符集盡量統一使用UTF8
(1)可以避免亂碼問題;
(2)可以避免,不同字符集比較轉換,導致的索引失效問題;
9、 count(*) from table;
這樣不帶任何條件的count會引起全表掃描,并且沒有任何業務意義,是一定要杜絕的 。
10、 避免在where中對字段進行表達式操作
(1)SQL解析時 , 如果字段相關的是表達式就進行全表掃描 ;
(2)字段干凈無表達式收獲不止sql優化pdf,索引生效;
11、 關于臨時表
(1)避免頻繁創建和刪除臨時表,以減少系統表資源的消耗;
(2)在新建臨時表時,如果一次性插入數據量很大 , 那么可以使用into 代替table,避免造成大量 log;
(3)如果數據量不大,為了緩和系統表的資源,應先 table,然后;
(4)如果使用到了臨時表 , 在存儲過程的最后務必將所有的臨時表顯式刪除 。先table,然后 drop table ,這樣可以避免系統表的較長時間鎖定;
12、 索引不適合建在有大量重復數據的字段上,比如性別,排序字段應創建索引
13、 去重過濾字段要少
14、 盡量避免大事務操作,提高系統并發能力
15、 所有表必須使用存儲引擎
【SQL語句優化匯總】本文到此結束,希望對大家有所幫助 。
- 連B數都搞不懂,還敢在簡歷上寫精通MySQL?
- 學霸畢業設計Java+My SQL設計大型大學生公寓管理系統
- 二 Android性能優化系列篇:啟動優化
- 獨一無二的「MySQL 調優金字塔」相信也許你擁有了它,你就贏了
- SQL語言:DDL、DML、DQL、DCL詳解
- Win10系統優化及激活,驅動詳細教程
- 還在用360、電腦管家嗎?來試試這幾款系統優化軟件
- 優化行政區劃設置
- 您知道嗎?OnRobot可提供各種工具/附件優化您的協作應用程序
- 供應鏈結構優化的八大方法
