中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql進行sql優化的方法

發布時間:2020-09-29 15:06:23 來源:億速云 閱讀:166 作者:小新 欄目:MySQL數據庫

小編給大家分享一下mysql進行sql優化的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

mysql進行sql優化的方法:1、避免全表掃描,在where及order by涉及的列上建立索引;2、在where子句中避免對字段進行null值判斷,避免使用“!=”或“<>”操作符,避免使用or來連接條件;3、慎用in和not in。

MySQL中的SQL的常見優化策略

1 避免全表掃描

對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

2 避免判斷null值
應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:

select id from t where num=0

3 避免不等值判斷

應盡量避免在 where 子句中使用!=或<>操作符,否則引擎將放棄使用索引而進行全表掃描。

4 避免使用or邏輯
應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num=10 or num=20

可以這樣查詢:

select id from t where num=10
union all
select id from t where num=20

5 慎用in和not in邏輯
in 和 not in 也要慎用,否則會導致全表掃描,如:
select id from t1 where num in(select id from t2 where id > 10)
此時外層查詢會全表掃描,不使用索引。可以修改為:
select id from t1,(select id from t1 where id > 10)t2 where t1.id = t2.id
此時索引被使用,可以明顯提升查詢效率。

6 注意模糊查詢
下面的查詢也將導致全表掃描:
select id from t where name like '%abc%'
模糊查詢如果是必要條件時,可以使用select id from t where name like 'abc%'來實現模糊查詢,此時索引將被使用。如果頭匹配是必要邏輯,建議使用全文搜索引擎(Elastic search、Lucene、Solr等)。

7 避免查詢條件中字段計算
應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2

8 避免查詢條件中對字段進行函數操作
應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
應改為:
select id from t where name like 'abc%'

9 WHERE子句“=”左邊注意點
不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

10 組合索引使用
在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,并且應盡可能的讓字段順序與索引順序相一致。

11 不要定義無異議的查詢
不要寫一些沒有意義的查詢,如需要生成一個空表結構:
select col1,col2 into #t from t where 1=0
這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(...)

12 exists
很多時候用 exists 代替 in 是一個好的選擇:
select num from a where num in(select num from b)
用下面的語句替換:
select num from a where exists(select 1 from b where num=a.num)

13 索引也可能失效
并不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用。

14 表格字段類型選擇
盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對于數字型而言只需要比較一次就夠了。
盡可能的使用 varchar 代替 char ,因為首先可變長度字段存儲空間小,可以節省存儲空間,其次對于查詢來說,在一個相對較小的字段內搜索效率顯然要高些。

15 查詢語法中的字段
任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。

16 索引無關優化
不使用*、盡量不使用union,union all等關鍵字、盡量不使用or關鍵字、盡量使用等值判斷。

表連接建議不超過5個。如果超過5個,則考慮表格的設計。(互聯網應用中)

表連接方式使用外聯優于內聯。
外連接有基礎數據存在。如:A left join B,基礎數據是A。  
A inner join B,沒有基礎數據的,先使用笛卡爾積完成全連接,在根據連接條件得到內連接結果集。

大數據量級的表格做分頁查詢時,如果頁碼數量過大,則使用子查詢配合完成分頁邏輯。
Select * from table limit 1000000, 10
Select * from table where id in (select pk from table limit 100000, 10)

以上是mysql進行sql優化的方法的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青冈县| 泸州市| 永城市| 丰城市| 香河县| 绵竹市| 云阳县| 大竹县| 曲周县| 密山市| 宝山区| 永定县| 黄陵县| 涪陵区| 孙吴县| 涟源市| 冀州市| 秭归县| 益阳市| 通辽市| 小金县| 大宁县| 汤原县| 金堂县| 三原县| 邓州市| 油尖旺区| 始兴县| 梨树县| 湟源县| 东港市| 贡嘎县| 德令哈市| 赤城县| 霍邱县| 平陆县| 宝清县| 阿城市| 寿阳县| 陆川县| 齐齐哈尔市|