MySQL 核心知識點梳理(3)

目錄

SQL優化

23什么是慢SQL

如何優化呢?

如何利于覆蓋索引

如何使用聯合索引

如何進行分頁優化

Join代替子查詢

為什么要小表驅動大表?

為什么避免join太多的表?

如何進行排序優化

什么是filesort

全字段排序和rowid排序

條件下推

索引

索引為什么能提高MySQL的效率呢?

索引的分類

普通索引和唯一索引的區別

創建索引需要注意哪些

索引失效的情況

索引不適合哪些場景

什么適合創建索引

索引優化思路


SQL優化

23什么是慢SQL

MySQL 中有一個叫 long_query_time 的參數,原則上執行時間超過該參數值的 SQL 就是慢 SQL,會被記錄到慢查詢日志中。

如何優化呢?

首先要找到慢sql可以通過慢sql日志進行查詢.然后可以用Explain + sql語句 看有沒有用索引,大部分慢sql都是因為這個

1.避免不需要的列 避免select *

2.分頁優化

3.索引優化

4.Join優化

如何利于覆蓋索引

覆蓋索引的核心是“查詢所需的字段都在同一個索引里”,這樣 MySQL 就不需要回表,直接從索引中返回結果。

如何使用聯合索引

使用聯合索引最重要的一條是遵守最左前綴原則,也就是查詢條件需要從索引的左側字段開始。

如何進行分頁優化

分頁優化的核心是避免深度偏移帶來的全表掃描,可以通過兩種方式來優化:延遲關聯和添加書簽。分頁查詢的效率問題主要是由于 OFFSET 的存在,OFFSET 會導致 MySQL 必須掃描和跳過 offset + limit 條數據,這個過程是非常耗時的。

Join代替子查詢

第一,JOIN 的 ON 條件能更直接地觸發索引,而子查詢可能因嵌套導致索引失效。

第二,JOIN 的一次連接操作替代了子查詢的多次重復執行,尤其在大數據量的情況下性能差異明顯。

為什么要小表驅動大表?

第一,如果大表的 JOIN 字段有索引,那么小表的每一行都可以通過索引快速匹配大表。

時間復雜度為小表行數 N 乘以大表索引查找復雜度 log(大表行數 M),總復雜度為 N*log(M)。

顯然小表做驅動表比大表做驅動表的時間復雜度 M*log(N) 更低。

  1. 當使用 left join 時,左表是驅動表,右表是被驅動表。
  2. 當使用 right join 時,剛好相反。
  3. 當使用 join 時,MySQL 會選擇數據量比較小的表作為驅動表,大表作為被驅動表。
為什么避免join太多的表?

第一,多表 JOIN 的執行路徑會隨著表的數量呈現指數級增長,優化器需要估算所有路徑的成本,有可能會導致出現大表驅動小表的情況。

第二,多表 JOIN 需要緩存中間結果集,可能超出 join_buffer_size,這種情況下內存臨時表就會轉為磁盤臨時表,性能也會急劇下降。

如何進行排序優化

第一,對 ORDER BY 涉及的字段創建索引,避免 filesort。

如果是多個字段,聯合索引需要保證 ORDER BY 的列是索引的最左前綴。

第二,可以適當調整排序參數,如增大 sort_buffer_size、max_length_for_sort_data 等,讓排序在內存中完成。

第三,可以通過 where 和 limit 限制待排序的數據量,減少排序的開銷。

什么是filesort

當不能使用索引生成排序結果的時候,MySQL 需要自己進行排序,如果數據量比較小,會在內存中進行;如果數據量比較大就需要寫臨時文件到磁盤再排序,我們將這個過程稱為文件排序。

全字段排序和rowid排序

當排序字段是索引字段且滿足最左前綴原則時,MySQL 可以直接利用索引的有序性完成排序。

當無法使用索引排序時,MySQL 需要在內存或磁盤中進行排序操作,分為全字段排序和 rowid 排序兩種算法。

全字段排序會一次性取出滿足條件行的所有字段,然后在 sort buffer 中進行排序,排序后直接返回結果,無需回表。

以?SELECT * FROM user WHERE name = "王二" ORDER BY age?為例:

  • 從 name 索引中找到第一個滿足?name='張三'?的主鍵 id;
  • 根據主鍵 id 取出整行所有的字段,存入 sort buffer;
  • 重復上述過程直到處理完所有滿足條件的行
  • 對 sort buffer 中的數據按 age 排序,返回結果。

優點是僅需要一次磁盤 IO,缺點是內存占用大,如果數量超過 sort buffer 的話,需要分片讀取并借助臨時文件合并排序,IO 次數反而會增加。

也無法處理包含 text 和 blob 類型的字段。

rowid 排序分為兩個階段:

  • 第一階段:根據查詢條件取出排序字段和主鍵 ID,存入 sort buffer 進行排序;
  • 第二階段:根據排序后的主鍵 ID 回表取出其他需要的字段。

同樣以?SELECT * FROM user WHERE name = "王二" ORDER BY age?為例:

  • 從 name 索引中找到第一個滿足?name='張三'?的主鍵 id;
  • 根據主鍵 id 取出排序字段 age,連同主鍵 id 一起存入 sort buffer;
  • 重復上述過程直到處理完所有滿足條件的行
  • 對 sort buffer 中的數據按 age 排序;
  • 遍歷排序后的主鍵 id,回表取出其他所需字段,返回結果。

優點是內存占用較少,適合字段多或者數據量大的場景,缺點是需要兩次磁盤 IO。

條件下推

條件下推的核心思想是將外層的過濾條件,比如說 where、join 等,盡可能地下推到查詢計劃的更底層,比如說子查詢、連接操作之前,從而減少中間結果的數據量。就是盡量早點做過濾動作

索引

索引為什么能提高MySQL的效率呢?

索引就像一本書的目錄,能讓 MySQL 快速定位數據,避免全表掃描。

除了查得快,索引還能加速排序、分組、連接等操作。

MySQL索引的底層是B+樹 他比較矮壯 那么IO的次數就會少,效率就會比較高

索引的分類

從功能上分類的話,有主鍵索引、唯一索引、全文索引;從數據結構上分類的話,有 B+ 樹索引、哈希索引;從存儲內容上分類的話,有聚簇索引、非聚簇索引。

主鍵索引用于唯一標識表中的每條記錄,其列值必須唯一且非空。創建主鍵時,MySQL 會自動生成對應的唯一索引。

主鍵索引=唯一索引+非空。每個表只能有一個主鍵索引,但可以有多個唯一索引

主鍵索引不允許插入 NULL 值,嘗試插入 NULL 會報錯;唯一索引允許插入多個 NULL 值。\

普通索引和唯一索引的區別

普通索引僅用于加速查詢,不限制字段值的唯一性;適用于高頻寫入的字段、范圍查詢的字段。

唯一索引強制字段值的唯一性,插入或更新時會觸發唯一性檢查;適用于業務唯一性約束的字段、防止數據重復插入的字段。

全文索引是 MySQL 一種優化文本數據檢索的特殊類型索引,適用于 CHAR、VARCHAR 和 TEXT 等字段

創建索引需要注意哪些

第一,選擇合適的字段

第二,要控制索引的數量,避免過度索引,每個索引都要占用存儲空間,單表的索引數量不建議超過 5 個。

第三,聯合索引的時候要遵循最左前綴原則,即在查詢條件中使用聯合索引的第一個字段,才能充分利用索引。

索引失效的情況

1. 未遵循最左前綴原則
2. 在索引列上使用函數或運算
3. 使用不等于操作符(!=, <>)
4. 使用NOT IN或NOT EXISTS
5. 使用LIKE以通配符開頭
6. 隱式類型轉換
7. OR條件使用不當
8. 使用IS NULL或IS NOT NULL
9. 數據分布不均勻
10. 索引列參與計算
11. 使用ORDER BY不當
12. 索引選擇性過低
13. 統計信息過時
14. 索引未被維護
15. 查詢返回過多數據
16. 使用全表掃描提示
17. 多表連接條件不當
18. 子查詢處理不當
19. 使用UNION而非UNION ALL
20. 索引列使用表達式

索引不適合哪些場景

第一,區分度低的列,可以和其他高區分度的列組成聯合索引。

第二,頻繁更新的列,索引會增加更新的成本。

第三,TEXT、BLOB 等大對象類型的字段,可以使用前綴索引、全文索引替代。

第四,當表的數據量很小的時候,不超過 1000 行,全表掃描可能比使用索引更快。

什么是區分度

區分度是衡量一個字段在 MySQL 表中唯一值的比例。

區分度 = 字段的唯一值數量 / 字段的總記錄數;越接近 1,就越適合作為索引。因為索引可以更有效地縮小查詢范圍。一個表中有 1000 條記錄,其中性別字段只有兩個值(男、女),那么性別字段的區分度只有 0.002,就不適合建立索引。

什么適合創建索引

主鍵、唯一鍵、以及經常作為查詢條件的字段最適合加索引。除此之外,字段的區分度要高,這樣索引才能起到過濾作用;如果字段經常用于表連接、排序或分組,也建議加索引。同時如果多個字段經常一起出現在查詢條件中,也可以建立聯合索引來提升性能。

索引優化思路

先通過慢查詢日志找出性能瓶頸,然后用 EXPLAIN 分析執行計劃,判斷是否走了索引、是否回表、是否排序。接著根據字段特性設計合適的索引,如選擇區分度高的字段,使用聯合索引和覆蓋索引,避免索引失效的寫法,最后通過實測來驗證優化效果。

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

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

相關文章

關于注冊登錄功能制作的步驟(文件IO存儲+LVGL彈窗提示)

按你的需求&#xff08;文件IO存儲LVGL彈窗提示&#xff09;&#xff0c;工程需創建以下文件&#xff0c;代碼按功能模塊化存放&#xff0c;清晰明了&#xff1a;一、需要創建的文件清單 文件名 作用 存放內容 main.c 程序入口 主函數、硬件初始化、LVGL初始化、啟動界面 ui.…

自媒體端后臺設計指南:從注冊認證到內容管理的全流程搭建

自媒體端后臺設計指南&#xff1a;從注冊認證到內容管理的全流程搭建自媒體端后臺是專業創作者管理內容、粉絲和數據的核心陣地&#xff0c;其設計直接影響創作效率和平臺運營質量。一個功能清晰、操作便捷的后臺系統&#xff0c;能讓創作者專注于內容生產&#xff0c;而非被復…

uniapp掃描二維碼反色處理

在開發掃描二維碼過程中&#xff0c;發現白底黑碼可以直接用uni.scanCode掃描出來&#xff0c;但是黑底白碼就掃不出來&#xff0c;于是就試試反色后的二維碼能不能掃描出來&#xff0c;沒想到真的可以&#xff0c;下面附上完整代碼&#xff1a; <u-icon name"scan&quo…

C語言定義fixed_t什么意思

在 C 語言中&#xff0c;fixed_t 通常是一個自定義的類型別名&#xff08;typedef&#xff09;&#xff0c;用于表示固定點數&#xff08;Fixed-Point Number&#xff09;&#xff0c;而非 C 語言標準庫中的原生類型。它主要用于需要高效實數運算但無法使用浮點數的場景&#x…

音頻3A處理簡介之ANS(自動噪聲抑制)

我們常用的手機、消費類攝像頭等產品的麥克風所采集的原始聲音信號中往往包含了比較多的背景噪音&#xff0c;不僅影響用戶錄音和回放的使用體驗&#xff0c;而且這些噪聲數據還會降低音頻編碼的壓縮效率&#xff0c;因此有必要對音頻底噪進行抑制處理&#xff0c;這就是ANS&am…

Python 使用期物處理并發(使用concurrent.futures模塊啟動 進程)

使用concurrent.futures模塊啟動進程 concurrent.futures 模塊的文檔 &#xff08;https://docs.python.org/3/library/concurrent.futures.html&#xff09;副標題 是“Launching parallel tasks”&#xff08;執行并行任務&#xff09;。這個模塊實現的是真正 的并行計算&…

【系統全面】Linux內核原理——基礎知識介紹

理解內核&#xff1a;內核原理 計算機系統的軟件分層 不同于單片機中使用代碼直接與硬件交互&#xff0c;對于這種方式的缺點深有&#xff1a; &#xff08;1&#xff09;復雜度高&#xff0c;調用難度高&#xff0c;需要深入理解硬件的工作原理和細節。 &#xff08;2&#xf…

Oracle自治事務——從問題到實踐的深度解析

一、引言&#xff1a;當“關鍵操作”遇上主事務的“生死綁定”?先問大家一個問題&#xff1a;假設你在開發一個用戶管理系統&#xff0c;核心功能是“用戶注冊”&#xff0c;同時需要記錄“操作日志”。某天&#xff0c;用戶提交注冊信息時&#xff0c;數據庫突然因磁盤空間不…

廣播(Broadcast)和組播(Multicast)對比

概述 廣播&#xff08;Broadcast&#xff09;和組播&#xff08;Multicast&#xff09;是計算機網絡中兩種重要的一對多通信方式&#xff0c;用于高效地將數據同時分發給多個接收者&#xff0c;它們的核心區別在于目標接收者的范圍和控制精度&#xff0c;基于業務對效率、規模和…

在 HTTP GET 請求中傳遞參數有兩種標準方式

方法 1&#xff1a;URL 查詢參數&#xff08;Query Parameters&#xff09;格式&#xff1a;?參數名值&參數名2值2示例請求http://localhost:8080/hello?name張三&age25后端接收方式GetMapping("/hello") public String sayHello(RequestParam String name…

pycharm windows/linux/mac快捷鍵

適用于mac的快捷鍵 適用于windows和linux的快捷鍵 參考資料&#xff1a; https://www.jetbrains.com/zh-cn/help/pycharm/mastering-keyboard-shortcuts.html

前端包管理工具深度對比:npm、yarn、pnpm 全方位解析

前言&#xff1a;為什么我們需要包管理工具&#xff1f; 在現代前端開發中&#xff0c;模塊化已成為標配。一個中型項目可能依賴數百個第三方包&#xff0c;手動管理這些依賴幾乎是不可能的任務。包管理工具應運而生&#xff0c;它們不僅解決了依賴安裝問題&#xff0c;還提供了…

調試Claude code的正確姿勢

隨著kimi k2的發布&#xff0c;Claude code的使用頻率愈發的頻繁&#xff0c;在發現moonshot官方提供了調試工具之后&#xff0c;我對claude code的交互過程愈發好奇。 moonpalace的安裝 官方moonpalace倉庫地址 go語言編寫&#xff0c;可以直接下載二進制二進制文件&#x…

【常見分布及其特征(5)】連續型隨機變量-連續均勻分布

概率密度函數&#xff08;PDF&#xff09;與概率質量函數&#xff08;PMF&#xff09;說明 基本概念區分 對于連續型隨機變量&#xff0c;通常使用 概率密度函數 (Probability Density Function, PDF) 進行描述&#xff1b;這與離散型隨機變量使用的 概率質量函數 (Probabili…

FAN-UNET:用于生物醫學圖像分割增強模型

目錄 一、論文結構概述 二、創新點詳解 三、創新點結構與原理 &#xff08;1&#xff09;Vision-FAN Block&#xff1a;全局與周期特征的融合引擎 &#xff08;2&#xff09;FANLayer2D&#xff1a;周期性建模的核心 四、代碼復現思路 五、仿真結果分析 &#xff08;1&…

基于SpringBoot的籃球運動員體測數據分析及訓練管理系統論文

第1章 緒論 1.1 課題背景 互聯網發展至今&#xff0c;無論是其理論還是技術都已經成熟&#xff0c;而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播&#xff0c;搭配信息管理工具可以很好地為人們提供服務。所以各行業&#xff0c;尤其是規模較大的企業和學校等…

矩陣算法題

矩陣算法題1、矩陣置零2、螺旋矩陣3、旋轉圖像4、搜索二維矩陣1、矩陣置零 解題思路&#xff1a;這道題核心是要確定哪些行和哪些列要置零。所以定義兩個數組&#xff0c;一個記錄要置零的行&#xff0c;一個記錄要置零的列。遍歷整個矩陣&#xff0c;如果當前位置是0的話&…

Spring底層(二)Spring IOC容器加載流程原理

一、怎么理解SpringIoc IOC&#xff1a;Inversion Of Control&#xff0c;即控制反轉&#xff0c;是一種設計思想。之前對象又程序員自己new自己創建&#xff0c;現在Spring注入給我們&#xff0c;這樣的創建權力被反轉了。 所謂控制就是對象的創建、初始化、銷毀。 創建對象…

UDP中的單播,多播,廣播

文章目錄UDP 簡單回顧一、單播&#xff08;Unicast&#xff09;定義特點應用舉例二、廣播&#xff08;Broadcast&#xff09;定義特點應用三、多播&#xff08;Multicast&#xff09;定義特點應用UDP 單播、廣播、多播的對比總結額外說明代碼簡要示例&#xff08;C&#xff09;…

數據庫練習3

一、建立product表&#xff0c;操作方式operate表要求&#xff1a;1.定義觸發器實現在產品表(product)中每多一個產品,就在操作表(operate)中記錄操作方式和時間以及編號記錄。注&#xff1a;操作說明&#xff1a;標記執行delete 、insert、 update2.定義觸發器實現在產品表(pr…