色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL執行過程:如何進行sql 優化

OSC開源社區 ? 來源:京東云開發者-京東科技 ? 2023-12-12 10:19 ? 次閱讀

回顧 MySQL 的執行過程,幫助介紹如何進行 sql 優化。

(1)客戶端發送一條查詢語句到服務器; (2)服務器先查詢緩存,如果命中緩存,則立即返回存儲在緩存中的數據; (3)未命中緩存后,MySQL 通過關鍵字將 SQL 語句進行解析,并生成一顆對應的解析樹,MySQL 解析器將使用 MySQL 語法進行驗證和解析。 例如,驗證是否使用了錯誤的關鍵字,或者關鍵字的使用是否正確; (4)預處理是根據一些 MySQL 規則檢查解析樹是否合理,比如檢查表和列是否存在,還會解析名字和別名,然后預處理器會驗證權限; 根據執行計劃查詢執行引擎,調用 API 接口調用存儲引擎來查詢數據; (5)將結果返回客戶端,并進行緩存;

eb116ebe-9816-11ee-8b88-92fbcf53809c.png

SQL 語句性能優化常用策略

1、 為 WHERE 及 ORDER BY 涉及的列上建立索引

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

2、where 中使用默認值代替 null 應盡量避免在 WHERE 子句中對字段進行 NULL 值判斷,創建表時 NULL 是默認值,但大多數時候應該使用 NOT NULL,或者使用一個特殊的值,如 0,-1 作為默認值。

為啥建議 where 中使用默認值代替 null,四個原因:

(1)并不是說使用了 is null 或者 is not null 就會不走索引了,這個跟 mysql 版本以及查詢成本都有關;

(2)如果 mysql 優化器發現,走索引比不走索引成本還要高,就會放棄索引,這些條件!=,《》,is null,is not null 經常被認為讓索引失效;

(3)其實是因為一般情況下,查詢的成本高,優化器自動放棄索引的;

(4)如果把 null 值,換成默認值,很多時候讓走索引成為可能,同時,表達意思也相對清晰一點;

3、慎用!= 或 《》 操作符。

MySQL 只有對以下操作符才使用索引:《,《=,=,》,》=,BETWEEN,IN,以及某些時候的 LIKE。

所以:應盡量避免在 WHERE 子句中使用!= 或 《》 操作符, 會導致全表掃描。

4、慎用 OR 來連接條件

使用 or 可能會使索引失效,從而全表掃描;

應盡量避免在 WHERE 子句中使用 OR 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,

可以使用 UNION 合并查詢:

select id from t where num=10

union all

select id from t where num=20

一個關鍵的問題是否用到索引。他們的速度只同是否使用索引有關,如果查詢需要用到聯合索引,用 UNION all 執行的效率更高。多個 OR 的字句沒有用到索引,改寫成 UNION 的形式再試圖與索引匹配。

5、慎用 IN 和 NOT IN

IN 和 NOT IN 要慎用,否則會導致全表掃描。對于連續的數值,能用 BETWEEN 就不要用 IN:select id from t where num between 1 and 3。

6、慎用 左模糊 like ‘%…’

模糊查詢,程序員最喜歡的就是使用 like,like 很可能讓索引失效。

比如:

select id from t where name like‘% abc%’ select id from t where name like‘% abc’ 而 select id from t where name like‘abc%’才用到索引。

所以:

首先盡量避免模糊查詢,如果必須使用,不采用全模糊查詢,也應盡量采用右模糊查詢, 即 like ‘…%’,是會使用索引的;左模糊 like ‘%…’無法直接使用索引,但可以利用 reverse + function index 的形式,變化成 like ‘…%’;全模糊查詢是無法優化的,一定要使用的話建議使用搜索引擎,比如 ElasticSearch。備注:如果一定要用左模糊 like ‘%…’檢索, 一般建議 ElasticSearch+Hbase 架構

7、WHERE 條件使用參數會導致全表掃描。

如下面語句將進行全表掃描:

select id from t where num=@num

因為 SQL 只有在運行時才會解析局部變量,但優化程序不能將訪問計劃的選擇推 遲到 運行時;

它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。

所以, 可以改為強制查詢使用索引:

select id from t with (index (索引名)) where num=@num

8、用 EXISTS 代替 IN 是一個好的選擇

很多時候用 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)

9、索引并不是越多越好

索引固然可以提高相應的 SELECT 的效率,但同時也降低了 INSERT 及 UPDATE 的效。

因為 INSERT 或 UPDATE 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。

一個表的索引數最好不要超過 6 個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

10、盡量使用數字型字段

(1)因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符;

(2)而對于數字型而言只需要比較一次就夠了;

(3)字符會降低查詢和連接的性能,并會增加存儲開銷;

所以:盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。

11、盡可能的使用 varchar, nvarchar 代替 char, nchar

(1)varchar 變長字段按數據內容實際長度存儲,存儲空間小,可以節省存儲空間;

(2)char 按聲明大小存儲,不足補空格;

(3)其次對于查詢來說,在一個相對較小的字段內搜索,效率更高;

因為首先變長字段存儲空間小,可以節省存儲空間,其次對于查詢來說,在一個相對較小的字段內搜索效率顯然要高些。

14、查詢 SQL 盡量不要使用 select *,而是具體字段

最好不要使用返回所有:select * from t ,用具體的字段列表代替 “*”,不要返回用不到的任何字段。

select * 的弊端:

(1)增加很多不必要的消耗,比如 CPU、IO、內存、網絡帶寬;

(2)增加了使用覆蓋索引的可能性;

(3)增加了回表的可能性;

(4)當表結構發生變化時,前端也需要更改;

(5)查詢效率低;

15、將需要查詢的結果預先計算好

將需要查詢的結果預先計算好放在表中,查詢的時候再 Select,而不是查詢的時候進行計算。

16、IN 后出現最頻繁的值放在最前面

如果一定用 IN,那么:在 IN 后面值的列表中,將出現最頻繁的值放在最前面,出現得最少的放在最后面,減少判斷的次數。

17、盡量使用 EXISTS 代替 select count (1) 來判斷是否存在記錄。

count 函數只有在統計表中所有行數時使用,而且 count (1) 比 count (*) 更有效率。

18、用批量插入或批量更新

當有一批處理的插入或更新時,用批量插入或批量更新,絕不會一條條記錄的去更新。

(1)多條提交

INSERT INTO user (id,username) VALUES(1,‘xx’); INSERT INTO user (id,username) VALUES(2,‘yy’);

(2)批量提交

INSERT INTO user (id,username) VALUES (1,‘xx’),(2,‘yy’); 默認新增 SQL 有事務控制,導致每條都需要事務開啟和事務提交,而批量處理是一次事務開啟和提交,效率提升明顯,達到一定量級,效果顯著,平時看不出來。

19、將不需要的記錄在 GROUP BY 之前過濾掉

提高 GROUP BY 語句的效率,可以通過將不需要的記錄在 GROUP BY 之前過濾掉。

下面兩個查詢返回相同結果,但第二個明顯就快了許多。

低效:

SELECT JOB, AVG (SAL) FROM EMP GROUP BY JOB HAVING JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’ 高效:

SELECT JOB, AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’ GROUP BY JOB

20、避免死鎖

在你的存儲過程和觸發器中訪問同一個表時總是以相同的順序;事務應經可能地縮短,在一個事務中應盡可能減少涉及到的數據量;永遠不要在事務中等待用戶輸入。

21、索引創建規則:

表的主鍵、外鍵必須有索引;

數據量超過 300 的表應該有索引;

經常與其他表進行連接的表,在連接字段上應該建立索引;

經常出現在 WHERE 子句中的字段,特別是大表的字段,應該建立索引;

索引應該建在選擇性高的字段上;

索引應該建在小字段上,對于大的文本字段甚至超長字段,不要建索引;

復合索引的建立需要進行仔細分析,盡量考慮用單字段索引代替;

正確選擇復合索引中的主列字段,一般是選擇性較好的字段;

復合索引的幾個字段是否經常同時以 AND 方式出現在 WHERE 子句中?單字段查詢是否極少甚至沒有?如果是,則可以建立復合索引;否則考慮單字段索引;

如果復合索引中包含的字段經常單獨出現在 WHERE 子句中,則分解為多個單字段索引;

如果復合索引所包含的字段超過 3 個,那么仔細考慮其必要性,考慮減少復合的字段;

如果既有單字段索引,又有這幾個字段上的復合索引,一般可以刪除復合索引;

頻繁進行數據操作的表,不要建立太多的索引;刪除無用的索引,避免對執行計劃造成負面影響;

表上建立的每個索引都會增加存儲開銷,索引對于插入、刪除、更新操作也會增加處理上的開銷。

另外,過多的復合索引,在有單字段索引的情況下,一般都是沒有存在價值的;相反,還會降低數據增加刪除時的性能,特別是對頻繁更新的表來說,負面影響更大。盡量不要對數據庫中某個含有大量重復的值的字段建立索引。

22、在寫 SQL 語句時,應盡量減少空格的使用

查詢緩沖并不自動處理空格,因此,在寫 SQL 語句時,應盡量減少空格的使用,尤其是在 SQL 首和尾的空格(因為查詢緩沖并不自動截取首尾空格)。

23、每張表都設置一個 ID 做為其主鍵

我們應該為數據庫里的每張表都設置一個 ID 做為其主鍵,而且最好的是一個 INT 型的(推薦使用 UNSIGNED),并設置上自動增加的 AUTO_INCREMENT 標志。

24、使用 explain 分析你 SQL 執行計劃

(1)type

system:表僅有一行,基本用不到;

const:表最多一行數據配合,主鍵查詢時觸發較多;

eq_ref:對于每個來自于前面的表的行組合,從該表中讀取一行。這可能是最好的聯接類型,除了 const 類型;

ref:對于每個來自于前面的表的行組合,所有有匹配索引值的行將從這張表中讀取;

range:只檢索給定范圍的行,使用一個索引來選擇行。當使用 =、《》、》、》=、《、《=、IS NULL、《=》、BETWEEN 或者 IN 操作符,用常量比較關鍵字列時,可以使用 range;

index:該聯接類型與 ALL 相同,除了只有索引樹被掃描。這通常比 ALL 快,因為索引文件通常比數據文件小;

all:全表掃描;

性能排名:system 》 const 》 eq_ref 》 ref 》 range 》 index 》 all。實際 sql 優化中,最后達到 ref 或 range 級別。

(2)Extra 常用關鍵字

Using index:只從索引樹中獲取信息,而不需要回表查詢;

Using where:WHERE 子句用于限制哪一個行匹配下一個表或發送到客戶。除非你專門從表中索取或檢查所有行,如果 Extra 值不為 Using where 并且表聯接類型為 ALL 或 index,查詢可能會有一些錯誤。需要回表查詢。

Using temporary:mysql 常建一個臨時表來容納結果,典型情況如查詢包含可以按不同情況列出列的 GROUP BY 和 ORDER BY 子句時;

25、當只要一行數據時使用 LIMIT 1

當你查詢表的有些時候,你已經知道結果只會有一條結果,但因為你可能需要去 fetch 游標,或是你也許會去檢查返回的記錄數。

在這種情況下,加上 LIMIT 1 可以增加性能。

這樣一來,MySQL 數據庫引擎會在找到一條數據后停止搜索,而不是繼續往后查少下一條符合記錄的數據。

26、將大的 DELETE,UPDATE、INSERT 查詢變成多個小查詢

能寫一個幾十行、幾百行的 SQL 語句是不是顯得逼格很高?然而,為了達到更好的性能以及更好的數據控制,你可以將他們變成多個小查詢。

27、合理分表 盡量控制單表數據量的大小,建議控制在 500 萬以內

500 萬并不是 MySQL 數據庫的限制,過大會造成修改表結構,備份,恢復都會有很大的問題。

可以用歷史數據歸檔(應用于日志數據),分庫分表(應用于業務數據)等手段來控制數據量大小。

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9295

    瀏覽量

    85869
  • 客戶端
    +關注

    關注

    1

    文章

    290

    瀏覽量

    16736
  • MySQL
    +關注

    關注

    1

    文章

    829

    瀏覽量

    26674

原文標題:淺談SQL優化小技巧

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數據庫SQL優化

    數據庫執行SQL都會先進行語義解析,然后將SQL分成一步一步可執行的計劃,然后逐步執行。通過分析
    的頭像 發表于 10-09 15:43 ?1087次閱讀
    數據庫<b class='flag-5'>SQL</b>的<b class='flag-5'>優化</b>

    MySQL執行過程 SQL語句性能優化常用策略

    回顧 MySQL執行過程,幫助介紹如何進行 sql 優化
    的頭像 發表于 12-12 10:26 ?701次閱讀
    <b class='flag-5'>MySQL</b>的<b class='flag-5'>執行</b><b class='flag-5'>過程</b> <b class='flag-5'>SQL</b>語句性能<b class='flag-5'>優化</b>常用策略

    淺談SQL優化小技巧

    作者:京東零售 王軍 回顧:MySQL執行過程回顧 MySQL執行過程,幫助 介紹 如
    的頭像 發表于 12-25 09:59 ?542次閱讀

    DRDS分布式SQL引擎—執行計劃介紹

    哈希連接等。執行計劃可以為用戶進行 SQL 調優提供重要依據。DRDS 執行計劃與多數數據庫系統類似,DRDS 在處理 SQL 時,會通過
    發表于 07-12 17:01

    一文讀懂SQL Server和MySQL的區別

    SQL Server和MySQL的區別主要體現在下面這些方面: 一、本質區別是它們所遵循的基本原則 二、發行費用上:MySQL不全是免費,但很便宜 三、性能方面:先進的MySQL
    發表于 09-28 11:29 ?8.3w次閱讀

    在Linux系統下執行MySQLSQL文件程序免費下載

    本文檔的主要內容詳細介紹的是在Linux系統下執行MySQLSQL文件程序免費下載。
    發表于 11-01 17:29 ?4次下載

    MySQL存儲引擎完成更新語句執行的方法

    首先肯定是我們的系統通過一個數據庫連接發送到了MySQL上,然后肯定會經過SQL接口、解析器、優化器、執行器幾個環節,解析SQL語句,生成
    的頭像 發表于 10-21 10:40 ?2081次閱讀
    <b class='flag-5'>MySQL</b>存儲引擎完成更新語句<b class='flag-5'>執行</b>的方法

    select語句和update語句分別是怎么執行

    一樣,但是具體的實現還是有區別的。 當然深入了解select和update的具體區別并不是只為了面試,當希望Mysql能夠高效的執行的時候,最好的辦法就是清楚的了解Mysql是如何執行
    的頭像 發表于 11-03 09:41 ?3598次閱讀
    select語句和update語句分別是怎么<b class='flag-5'>執行</b>的

    SQL后悔藥,SQL性能優化SQL規范優雅

    每一個好習慣都是一筆財富,本文基于MySQL,分SQL后悔藥, SQL性能優化SQL規范優雅三個方向,分享寫
    的頭像 發表于 11-14 09:54 ?1873次閱讀

    一條SQL語句是怎么被執行

    一直是想知道一條SQL語句是怎么被執行的,它執行的順序是怎樣的,然后查看總結各方資料,就有了下面這一篇博文了。 本文將從MySQL總體架構---》查詢
    的頭像 發表于 09-12 09:44 ?1532次閱讀
    一條<b class='flag-5'>SQL</b>語句是怎么被<b class='flag-5'>執行</b>的

    深入探索SQL Server與MySQL的性能和特性

    MySQLSQL Server有許多相似之處,但它們也有明顯的區別。在它們之間進行選擇時,必須考慮每個系統的優缺點。
    的頭像 發表于 05-09 17:31 ?2279次閱讀

    將外部sql文件導入MySQL步驟

    將外部sql文件導入MySQL是一項非常常見的操作,它允許我們將事先準備好的數據或數據庫結構導入到MySQL數據庫中。本文將詳細介紹該過程的步驟,并提供一些實用的技巧和注意事項。 在開
    的頭像 發表于 11-21 11:00 ?1701次閱讀

    mysqlsql server區別

    MySQLSQL Server是兩種常見的關系型數據庫管理系統(RDBMS),用于存儲和管理數據庫。雖然它們都支持SQL語言,但在其他方面存在一些顯著的區別。以下是MySQL
    的頭像 發表于 11-21 11:07 ?1576次閱讀

    sql where條件的執行順序

    。 在深入討論WHERE條件的執行順序之前,先回顧一下一般SQL語句的執行順序。一條SQL語句的執行通常可以分為以下幾個步驟:解析器分析語法
    的頭像 發表于 11-23 11:31 ?2271次閱讀

    查詢SQLmysql內部是如何執行

    我們知道在mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結果。這條查詢語句在 MySQL 內部到底是如何執行的呢?本文跟大家探討一下哈,我們先來看下
    的頭像 發表于 01-22 14:53 ?618次閱讀
    查詢<b class='flag-5'>SQL</b>在<b class='flag-5'>mysql</b>內部是如何<b class='flag-5'>執行</b>?
    主站蜘蛛池模板: 色WWW永久免费视频首页 | 最近中文字幕MV免费看 | 2020国产成人精品视频人 | 国家产午夜精品无人区 | 狠狠综合久久综合88亚洲 | wwwxxx日本护士| 精品国产免费人成视频 | 蜜桃视频一区二区 | 精品国产乱码久久久久久人妻 | 成年人视频在线免费观看 | 日产日韩亚洲欧美综合搜索 | 制服丝袜 快播 | 女人高潮特级毛片 | 人妻满熟妇AV无码区国产 | 精品无码久久久久久国产百度 | 灌饱娇嫩H将军公主最新章节 | 国产成人综合网在线观看 | 一个人的免费高清影院 | 亚洲在线2018最新无码 | 四虎影视国产精品亚洲精品 | 2019久久这里只精品热在线观看 | 超碰免费视频公开97 | 久久亚洲精品成人 | 国产中文欧美日韩在线 | 国产人妻麻豆蜜桃色精 | 红番阁免费观看 | 欧美三级黄色大片 | 日本调教网站 | 欧美在线亚洲综合国产人 | 亚洲久热无码中文字幕 | 丰满人妻妇伦又伦精品APP国产 | 天天夜夜草草久久亚洲香蕉 | 久久精品国产久精国产果冻传媒 | 日韩亚射吧 | 蜜臀亚洲AV永久无码精品老司机 | 久久99视频免费 | 国产精品久久久久久AV免费不卡 | 青春草国产成人精品久久 | www.黄色| 久拍国产在线观看 | 台湾果冻传媒在线观看 |