八股學習(四)---MySQL

一、MySQL如何進行SQL調優?

我的回答:

面試官好!我想從SQL語句本身和數據庫結構兩方面來做MySQL的SQL調優。

????????首先會優化SQL寫法,比如避免用SELECT *、減少子查詢嵌套,用JOIN代替,還有合理使用索引,比如給查詢頻繁的字段建索引,同時避免索引失效的情況,像用函數操作索引列。

????????另外,會關注表結構設計,比如拆分大表、使用合適的數據類型。還會通過慢查詢日志定位低效SQL,用EXPLAIN分析執行計劃。我在學習中試過給查詢頻繁的字段加索引,查詢效率確實提升了不少,這讓我覺得調優能直接解決實際問題,所以也在持續積累這方面的經驗,希望能更好地保證數據庫性能。

回答重點官方答案:

平時進行調優,主要是觀察慢SQL,然后利用explain分析查詢語句的執行計劃來優化查詢語句。

1.合理設計索引,利用聯合索引進行覆蓋索引的優化,避免回表的發生,減少一次查詢和隨機I/0。

2. 避免使用select *,只查詢必要的字段

3.避免在SQL中進行函數計算等操作,使得無法命中索引。

4.避免使用前綴帶 % 的模糊查詢,導致全表掃描

5.注意聯合索引需要滿足最左匹配規則

6.不要對無索引字段進行排序操作

7.連表查詢還要注意不同字段的字符集是否一致,否則也會導致全表掃描。

除此之外,還可以利用緩存來優化,一些變化少或者訪問頻繁的數據設置到緩存中,可以減輕數據庫的壓力,提升查詢效率,還可以通過業務來優化,例如少展示一些不必要的字段,減少多表查詢情況,將列表查詢替換成分頁分批查詢等等。

若接著問explain執行計劃中的各個字段

重點關注下面字段

二、如何使用MySQL的explain語句進行查詢分析?

我的答案:

首先就是要在需要分析的SQL前加上explain,執行后會得到一張表,里面的字段能反映查詢的關鍵信息,比如

看type字段,它表示連接類型,像const,eq_ref是比較好的。如果出現all就是全表掃描,就需要優化。

possible key字段是可能用到的索引。

key字段能看出實際用到的索引,如果是null就說明沒走索引,此時要檢查索引設計或SQL寫法。

key_len是索引中使用的字節數,是索引字段最大可能長度,長度越短越好

rows字段大概估計要掃描的行數,數值越小越好。

我之前聯系的時候,寫了一個沒有加索引的sql,用explain發現type是all,rows很大,加了索引之后,type變成ref,rows小了很多。查詢速度快了很多。現在我每次寫復雜sql都會先用explain分析一下,看是否有全表掃描、索引失效的情況,再針對性優化,慢慢的也更能理解索引和查詢執行的關系了,以后會繼續用這個工具提升SLQ效率

回答重點官方答案:

explain 主要用來 SQL 分析,它主要的屬性詳解如下:

  • id :查詢的執行順序的標識符,值越大優先級越高。簡單查詢的 id 通常為 1,復雜查詢(如包含子查詢或 UNION)的 id 會有多個。
  • select_type(重要):查詢的類型,如 SIMPLE(簡單查詢)、PRIMARY(主查詢)、SUBQUERY(子查詢)等。
  • table :查詢的數據表。
  • type(重要):訪問類型,如 ALL(全表掃描)、index(索引掃描)、range(范圍掃描)等。一般來說,性能從好到差的順序是:const > eq_ref > ref > range > index > ALL。
  • possible_keys :可能用到的索引。
  • key(重要):實際用到的索引。
  • key_len :用到索引的長度。
  • ref :顯示索引的哪一列被使用。
  • rows(重要):估計要掃描的行數,值越小越好。
  • filtered :顯示查詢條件過濾掉的行的百分比。一個高百分比表示查詢條件的選擇性好。
  • Extra(重要):額外信息,如 Using index(表示使用覆蓋索引)、Using where(表示使用 WHERE 條件進行過濾)、Using temporary(表示使用臨時表)、Using filesort(表示需要額外的排序步驟)。

type 詳解:

  • system:表示查詢的表只有一行(系統表)。這是一個特殊的情況,不常見。
  • const:表示查詢的表最多只有一行匹配結果。這通常發生在查詢條件是主鍵或唯一索引,并且是常量比較。
  • eq_ref:表示對于每個來自前一張表的行,MySQL 僅訪問一次這個表。這通常發生在連接查詢中使用主鍵或唯一索引的情況下。
  • ref:MySQL 使用非唯一索引掃描來查找行。查詢條件使用的索引是非唯一的(如普通索引)。
  • range:表示 MySQL 會掃描表的一部分,而不是全部行。范圍掃描通常出現在使用索引的范圍查詢中(如 BETWEEN、>,<,>=,<= )。
  • index:表示 MySQL 掃描索引中的所有行,而不是表中的所有行。即使索引列的值覆蓋查詢,也需要掃描整個索引。
  • all(性能最差):表示 MySQL 需要掃描表中的所有行,即全表掃描。通常出現在沒有索引的查詢條件中。

三、MySQL中的索引數量是否越多越好,為什么?

我的回答:

索引并不是越多越好,因為索引不論是從時間上還是空間上都是有一定成本的。

索引雖然能夠加快查詢速度,但會增加寫操作(插入、更新、刪除)的開銷,每次增刪改數據,不僅僅要修改表中數據,還要維護對應索引結構,索引越多,維護成本越高,可能拖慢寫入性能。而且索引會占用額外的存儲空間,太多的索引會浪費磁盤空間

另外查詢時數據庫可能會在多個索引中選擇不合適的,反而影響查詢效率。我之前試過給一張表加了多個索引,結果插入數據的速度明顯慢了許多,所以索引要按需創建,要在查詢和寫入之間找平衡,所以我現在會根據實際查詢場景合理建索引,避免盲目添加。

回答重點(官方答案)


索引并不是越多越好。因為索引不論從時間還是空間上都是有一定成本的

  1. 從時間上
    每次對表中的數據進行增刪改 (INSERT、UPDATE 或 DELETE) 的時候,索引也必須被更新,這會增加寫入操作的開銷。例如刪除了一個 name 為張三的記錄,不僅主鍵索引上需要修改,如果 name 字段有索引,那么 name 索引也需要修改,所以索引越多需要修改的地方也就越多,時間開銷就大了,并且 B+ 樹可能會有頁分裂、合并等操作,時間開銷就會更大。
    還有一點需要注意:MySQL 有個查詢優化器,它需要分析當前的查詢,選擇最優的計劃,這過程就需要考慮選擇哪個索引的查詢成本低。如果索引過多,那么會導致優化器耗費更多的時間在選擇上,甚至可能因為數據的不準確而選擇了次優的索引。

  2. 從空間上
    每建立一個二級索引,都需要新建一個 B+ 樹,默認每個數據頁都是 16KB,如果數據量很大,索引又很多,占用的空間可不小。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88124.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華中科大首創DNN衍射量子芯片登《Science Advances》:3D打印實現160μm3高維邏輯門

01 前言華中科技大學王健/劉駿團隊在《Science Advances》發表突破性研究&#xff0c;利用飛秒激光三維打印技術&#xff0c;制造出全球首個聚合物基超緊湊高維量子光芯片。該芯片僅160微米見方&#xff08;約頭發絲直徑的1.5倍&#xff09;&#xff0c;卻實現了光子空間模式的…

【排序】插入排序

如果你已經對排序略知一二&#xff0c;現在正在復習排序的一些重點知識 ------------------------------------------------------------------------------------------------------------------------- 點贊收藏&#x1f308;&#xff0c;每天更新總結文章&#xff08;多以圖…

扣子Coze怎么模仿人類輸出(分段輸出)?

效果&#xff1a; 讓AI回復的更像人類 教程&#xff1a; 工作流&#xff1a; 假設大模型節點就是需要的回復&#xff0c;并且已經按句號&#xff08;。&#xff09;區別開每句話 后面連接一個 文本處理 節點&#xff0c;選擇“字符串分隔”&#xff0c;按“。”進行分割 分…

Android 應用開發 | 一種限制拷貝速率解決因 IO 過高導致系統卡頓的方法

文章目錄一、問題背景二、代碼實現一、問題背景 經常做 Android 應用的小伙伴應該會有經驗&#xff0c;就是如果應用在寫入文件的時候&#xff0c;即使寫文件的動作是在子線程&#xff0c;也會出現 UI 上的卡頓&#xff0c;這是因為文件的 IO 是由內核去完成的&#xff0c;此時…

力扣面試150(19/150)

7.7 12. 整數轉羅馬數字 七個不同的符號代表羅馬數字&#xff0c;其值如下&#xff1a; 符號值I1V5X10L50C100D500M1000 羅馬數字是通過添加從最高到最低的小數位值的轉換而形成的。將小數位值轉換為羅馬數字有以下規則&#xff1a; 如果該值不是以 4 或 9 開頭&#xff0c;…

數據結構與算法——從遞歸入手一維動態規劃【1】

前言&#xff1a; 簡單記錄對左程云系列算法課程--算法講解066【必備】的學習&#xff0c;這是第一篇。主要提供C代碼和一些簡單的個人理解&#xff0c;如需要細致講解請移步原視頻。 涉及內容&#xff1a; 斐波那契數列、動態規劃 參考視頻&#xff1a; 左程云--算法講解…

搭建個人博客系列--Nacos 注冊中心

基礎項目已完成&#xff0c;接下來就是SpringCloud的各種組件了。 那你又要問&#xff1a;既然有Nacos為什么之前還裝了Apollo&#xff1f; 那你別管&#xff0c;那不得什么都會點&#xff0c;不然怎么找工作。干就完了。 一、安裝Nacos 管他三七二十一&#xff0c;先在doc…

前端實習總結——案例與大綱

以下是一個結合真實場景的前端面試案例&#xff0c;包含面試流程、核心問題、候選人回答思路及面試官考察點&#xff0c;可直觀感受如何在面試中展現實習/項目經歷&#xff1a; 案例背景 候選人&#xff1a;應屆生&#xff0c;有6個月前端實習經歷&#xff0c;參與過“企業內部…

Web前端開發: :where(偽類函數選擇器)

:where(偽類函數選擇器)&#xff1a;:where() 是 CSS Selectors Level 4 規范中引入的一個強大的偽類函數選擇器&#xff0c;它允許開發者以簡潔的方式編寫復雜的選擇器&#xff0c;同時具有獨特的優先級特性。核心概念&#xff1a;:where() 偽類函數選擇器與 :is() 非常相似&a…

EfficientVMamba: Atrous Selective Scan for Light Weight Visual Mamba論文精讀(逐段解析)

EfficientVMamba: Atrous Selective Scan for Light Weight Visual Mamba論文精讀&#xff08;逐段解析&#xff09; 論文地址&#xff1a;https://arxiv.org/abs/2403.09977 CVPR 2024 Abstract. Prior efforts in light-weight model development mainly centered on CNN an…

Integer緩沖區

文章目錄常見面試題&#xff1a;總結Integer緩沖區是Java預先創建的一個固定范圍的Integer對象緩存池&#xff08;默認-128到127&#xff09;&#xff0c;用于自動復用頻繁使用的整數值&#xff0c;減少內存開銷和對象創建。當通過自動裝箱或Integer.valueOf()生成該范圍內的整…

[國家電網備考]計算機網絡

計算機網絡的概述 概念: 用通信設備與線路將地理位置不同,功能獨立的計算機系統互連起來,以功能完善的網絡軟件實現網絡中資源共享和信息傳遞的系統 自治計算機: 能夠自我管理,配置,維護的計算機(目前我們使用的電腦) 以前的終端只有顯示器,不能叫做自治計算機 計算機網絡向用戶…

在 Linux(openEuler 24.03 LTS-SP1)上安裝 Kubernetes + KubeSphere 的防火墻放行全攻略

目錄 在 Linux&#xff08;openEuler 24.03 LTS-SP1&#xff09;上安裝 Kubernetes KubeSphere 的防火墻放行全攻略 一、為什么要先搞定防火墻&#xff1f; 二、目標環境 三、需放行的端口和協議列表 四、核心工具說明 1. 修正后的 exec.sh 腳本&#xff08;支持管道/重…

HTTP 響應頭信息詳解

HTTP 響應頭信息詳解 引言 HTTP(超文本傳輸協議)是互聯網上應用最為廣泛的網絡協議之一。在HTTP協議中,響應頭信息是服務器向客戶端發送的重要信息之一。響應頭信息包含了關于響應的元數據,如狀態碼、內容類型、緩存策略等。本文將詳細介紹HTTP響應頭信息的概念、類型、作…

去掉長按遙控器power鍵后提示關機、飛行模式的彈窗

首先找到對應長短按power鍵的位置&#xff1a;frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.javaprivate final Runnable mPowerLongPress new Runnable() {Overridepublic void run() {// The context isnt readif (mLongPressOnPowerBe…

Redis-哨兵機制Sentinel

redis的主從復制模式下,一旦主節點出現了故障無法提供服務了,需要人工進行主從切換,同時大量的客戶端需要被通知切換到新的主節點上,對于有了一定規模的應用來說,這種方案的延遲是無法接受的,于是redis2.8提供了Redis-Sentinel(哨兵)來解決這個問題. 目錄 1.啥是哨兵節點: 2.r…

SQL 視圖

SQL 視圖 引言 SQL 視圖是數據庫管理系統中的一種重要概念,它允許用戶以不同的方式查看數據庫中的數據。本文將詳細介紹 SQL 視圖的概念、作用、創建方法以及在實際應用中的注意事項。 一、SQL 視圖的概念 SQL 視圖是數據庫中的一種虛擬表,它并不存儲實際的數據,而是基于…

ESP32-使用VSCODE 各種問題總結匯總

1 問題 1 1.1 具體問題描述-config:idf.customExtraPath 無法正確描述launch.json 中使用了一個變量&#xff1a; ${config:idf.customExtraPaths}但在 VSCode 的設置中&#xff0c;并沒有找到對應的設置項 idf.customExtraPaths&#xff0c;所以無法解析。 1.2 問題解決 1.2.1…

【剪裁Patch】已標注的WSI剪裁Patch的處理流程(以QuPath軟件得到的標注信息為例)

1. 整體處理思路 整體處理流程如圖所示,概括來說就是:根據標注信息將WSI區分為腫瘤區域和正常區域,對這個區域進行采樣裁剪得到具有Patch級別標簽的Patch。 當然,這里的Patch標簽是根據標注信息決定的,如果標注的是癌癥亞型信息,那么也可以將不同亞型的Patch區分出來。 …

Qt 與Halcon聯合開發九:算法類設計與實現講解(附源碼)

一、設計背景 在機器視覺系統中&#xff0c;算法是系統的核心。不同產品、不同項目對圖像處理的要求不盡相同&#xff0c;因此算法需要具備&#xff1a; 靈活拓展&#xff1a;方便添加新算法統一調用&#xff1a;界面或上層邏輯不關心算法細節結構清晰&#xff1a;便于維護與…