MySQL篇(一):慢查詢定位及索引、B樹相關知識詳解

MySQL篇(一):慢查詢定位及索引、B樹相關知識詳解

  • MySQL篇(一):慢查詢定位及索引、B樹相關知識詳解
    • 一、MySQL中慢查詢的定位
      • (一)慢查詢日志的開啟
      • (二)慢查詢日志內容分析
      • (三)慢查詢分析工具
      • (四)慢查詢的常見原因
    • 二、索引
      • (一)索引的定義
      • (二)索引的作用
      • (三)索引的創建方式
      • (四)索引的類型
      • (五)索引的底層數據結構
    • 三、B樹和B+樹的區別
      • (一)節點數據存儲
      • (二)查詢過程
      • (三)范圍查詢支持
      • (四)插入和刪除操作
      • (五)應用場景

MySQL篇(一):慢查詢定位及索引、B樹相關知識詳解

一、MySQL中慢查詢的定位

(一)慢查詢日志的開啟

在MySQL中,慢查詢日志是定位慢查詢的重要工具。

  1. 通過配置文件開啟
    • 編輯MySQL的配置文件(通常是my.cnfmy.ini)。找到或添加以下配置:
    [mysqld]
    slow_query_log = 1
    slow_query_log_file = /var/lib/mysql/your_mysql_server_name-slow.log
    long_query_time = 2
    
    • 這里slow_query_log = 1表示開啟慢查詢日志;slow_query_log_file指定慢查詢日志文件的路徑和名稱;long_query_time = 2表示查詢執行時間超過2秒的語句會被記錄到慢查詢日志中。修改配置文件后,需要重啟MySQL服務使配置生效。
  2. 動態開啟(無需重啟服務)
    • 可以通過SQL語句動態開啟慢查詢日志:
    SET GLOBAL slow_query_log = 'ON';
    SET GLOBAL long_query_time = 2;
    
    • 這種方式設置的參數,在MySQL服務重啟后會失效。如果需要永久生效,還是建議修改配置文件。

(二)慢查詢日志內容分析

慢查詢日志記錄了慢查詢的詳細信息,包括查詢執行時間、查詢語句、使用的數據庫等。例如,慢查詢日志中的一條記錄可能如下:

# Time: 230915 15:30:45
# User@Host: root[root] @ localhost []
# Thread_id: 10  Schema: test  QC_hit: No
# Query_time: 3.500000  Lock_time: 0.000000  Rows_sent: 10  Rows_examined: 1000
SET timestamp=1694700645;
SELECT * FROM user WHERE age > 30;
  • Time:記錄查詢發生的時間。
  • User@Host:執行查詢的用戶和主機信息。
  • Query_time:查詢執行的時間,單位是秒。
  • Rows_examined:查詢過程中掃描的行數,這個值越大,通常說明查詢效率越低。
  • 查詢語句:具體的SQL查詢語句。

(三)慢查詢分析工具

  1. mysqldumpslow工具
    • mysqldumpslow是MySQL自帶的慢查詢分析工具。例如,要查看慢查詢日志中執行時間最長的10條查詢:
    mysqldumpslow -s t -t 10 /var/lib/mysql/your_mysql_server_name-slow.log
    
    • -s t表示按照查詢時間排序,-t 10表示只顯示前10條記錄。
    • 還可以通過其他參數進行更復雜的分析,比如按照掃描行數排序:
    mysqldumpslow -s r -t 10 /var/lib/mysql/your_mysql_server_name-slow.log
    
    • -s r表示按照掃描行數排序。
  2. pt-query-digest工具(Percona Toolkit的一部分)
    • pt-query-digest功能更強大,它可以對慢查詢日志進行更深入的分析,生成詳細的報告。首先需要安裝Percona Toolkit:
    • 在Ubuntu系統上:
    sudo apt-get install percona-toolkit
    
    • 使用pt-query-digest分析慢查詢日志:
    pt-query-digest /var/lib/mysql/your_mysql_server_name-slow.log
    
    • 它會輸出查詢的摘要信息,包括查詢執行時間分布、查詢模式、最耗時的查詢等。例如,會顯示類似以下的內容:
    # Profile
    # Rank Query ID Response time Calls Rows Rows examine
    # ==== ================== ============== ====== ====== ===========
    # 1 0x1234567890abcdef 10.000000 1 10 1000
    SELECT * FROM user WHERE age > 30;
    

(四)慢查詢的常見原因

  1. 缺少索引
    • 如果查詢語句沒有使用合適的索引,MySQL可能需要全表掃描。例如:
    SELECT * FROM order WHERE customer_name = 'John';
    
    • 如果customer_name字段沒有索引,當order表數據量很大時,查詢會非常慢。此時可以為customer_name字段創建索引:
    CREATE INDEX idx_customer_name ON order (customer_name);
    
  2. 復雜的查詢邏輯
    • 包含大量的JOIN、子查詢、聚合函數等復雜邏輯的查詢可能會很慢。例如:
    SELECT u.name, SUM(o.amount)
    FROM user u
    JOIN order o ON u.id = o.user_id
    GROUP BY u.name;
    
    • 如果user表和order表數據量都很大,且沒有合適的索引,這個查詢可能會很慢。可以優化JOIN條件,為關聯字段創建索引,如為user.idorder.user_id創建索引。
  3. 鎖等待
    • 在事務環境下,長時間的鎖等待也會導致查詢變慢。例如,一個事務對某條記錄加鎖后,另一個查詢需要等待鎖釋放。可以通過查看MySQL的鎖狀態相關視圖(如INFORMATION_SCHEMA.INNODB_LOCKS)來分析鎖等待問題。

二、索引

(一)索引的定義

索引是一種數據結構,用于快速查找數據庫表中的記錄。它就像一本書的目錄,通過索引可以快速定位到需要的數據,而不需要遍歷整個表。在MySQL中,索引存儲在磁盤上(InnoDB引擎也會將常用索引加載到內存中),不同的存儲引擎支持的索引類型有所不同。

(二)索引的作用

  1. 提高查詢效率
    • 最主要的作用是加快查詢速度。例如,在有索引的情況下,查詢語句SELECT * FROM product WHERE price > 100;可以通過索引快速定位到價格大于100的產品記錄,而不是全表掃描。
  2. 保證數據的唯一性
    • 唯一索引可以確保表中某一列或幾列的組合值是唯一的。例如,為user表的email字段創建唯一索引:
    CREATE UNIQUE INDEX idx_email ON user (email);
    
    • 這樣就可以保證email字段的值在表中是唯一的,避免重復數據。
  3. 支持JOIN操作
    • 在JOIN操作中,索引可以加快表與表之間的關聯速度。當兩個表通過關聯字段進行JOIN時,如果關聯字段有索引,MySQL可以更高效地匹配記錄。

(三)索引的創建方式

  1. 創建表時創建索引
    • 在創建表的SQL語句中直接定義索引。例如:
    CREATE TABLE student (id INT PRIMARY KEY,name VARCHAR(50),age INT,INDEX idx_age (age)
    );
    
    • 這里PRIMARY KEY創建了主鍵索引,同時INDEX idx_age (age)創建了一個普通的age字段索引。
  2. 使用CREATE INDEX語句創建索引
    • 對于已經存在的表,可以使用CREATE INDEX語句創建索引。例如:
    CREATE INDEX idx_name ON student (name);
    
    • 這會為student表的name字段創建一個索引。
  3. 使用ALTER TABLE語句創建索引
    • 也可以通過ALTER TABLE語句為表添加索引。例如:
    ALTER TABLE student ADD INDEX idx_age_name (age, name);
    
    • 這創建了一個組合索引,包含agename兩個字段。

(四)索引的類型

  1. 普通索引(INDEX)
    • 最基本的索引類型,沒有任何限制。可以加速查詢,但是不保證數據的唯一性。例如:
    CREATE INDEX idx_city ON address (city);
    
  2. 唯一索引(UNIQUE INDEX)
    • 保證索引列的值是唯一的。如前面提到的為email字段創建唯一索引。
    CREATE UNIQUE INDEX idx_unique_email ON user (email);
    
  3. 主鍵索引(PRIMARY KEY)
    • 是一種特殊的唯一索引,用于標識表中的唯一記錄。每個表只能有一個主鍵索引。在創建表時定義主鍵:
    CREATE TABLE product (id INT PRIMARY KEY,product_name VARCHAR(100)
    );
    
  4. 組合索引(復合索引)
    • 由多個字段組成的索引。例如,為order表的order_datecustomer_id創建組合索引:
    CREATE INDEX idx_order_date_customer_id ON order (order_date, customer_id);
    
    • 使用組合索引時,需要注意索引的順序。查詢條件中使用索引字段的順序要與創建索引時的順序一致(遵循最左匹配原則),才能有效使用索引。
  5. 全文索引(FULLTEXT INDEX)
    • 主要用于全文搜索,在MySQL中,InnoDB和MyISAM存儲引擎都支持全文索引。例如,為article表的content字段創建全文索引:
    CREATE FULLTEXT INDEX idx_content ON article (content);
    
    • 然后可以使用MATCH AGAINST語句進行全文搜索:
    SELECT * FROM article WHERE MATCH(content) AGAINST('keyword' IN NATURAL LANGUAGE MODE);
    

(五)索引的底層數據結構

  1. 哈希表(Hash)
    • 哈希索引通過哈希函數將索引值映射到哈希表中。它的優點是查詢效率高,等值查詢速度快。但是,哈希索引不支持范圍查詢,并且在數據量較大時可能會出現哈希沖突。MySQL中Memory存儲引擎支持哈希索引。例如:
    • 創建Memory表并使用哈希索引:
    CREATE TABLE test_hash (id INT,value VARCHAR(50),INDEX USING HASH (id)
    ) ENGINE = MEMORY;
    
  2. B樹和B+樹
    • B樹
      • B樹是一種自平衡的樹結構,它的每個節點可以包含多個鍵值對和子節點。B樹的特點是能夠在相對較少的磁盤I/O操作下完成查詢。在B樹中,每個節點中的鍵值是有序排列的,并且子節點的鍵值范圍也與父節點的鍵值相關。例如,在一個存儲整數的B樹中,父節點的某個鍵值會作為左右子節點鍵值范圍的分界點。
      • 當進行查詢時,從根節點開始,根據鍵值與節點中鍵值的比較,決定進入哪個子節點,直到找到目標鍵值或確定目標鍵值不存在。
    • B+樹
      • B+樹是B樹的一種變形。與B樹相比,B+樹有以下特點:
        • 節點數據:B+樹的非葉子節點只存儲鍵值,不存儲數據記錄,數據記錄都存儲在葉子節點中。而B樹的非葉子節點既存儲鍵值,也可能存儲數據記錄。
        • 查詢方式:B+樹的查詢必須到葉子節點才能找到數據記錄,而B樹在非葉子節點找到鍵值時就可能找到數據記錄。
        • 范圍查詢:B+樹的葉子節點之間通過指針連接,形成一個有序的鏈表,這使得范圍查詢非常高效。例如,查詢WHERE age BETWEEN 20 AND 30,在B+樹上可以通過葉子節點的鏈表快速遍歷范圍內的記錄。而B樹在進行范圍查詢時相對復雜。
      • 在MySQL的InnoDB存儲引擎中,索引主要使用B+樹結構。例如,聚簇索引(通常是主鍵索引)的葉子節點存儲了完整的數據記錄,而輔助索引(普通索引、唯一索引等)的葉子節點存儲的是主鍵值,通過主鍵值再去聚簇索引中查找完整的數據記錄。

三、B樹和B+樹的區別

(一)節點數據存儲

  1. B樹
    • B樹的非葉子節點既存儲鍵值,也可能存儲數據記錄。這意味著在B樹中,找到某個鍵值時,可能在非葉子節點就已經找到對應的數據記錄,不需要一直遍歷到葉子節點。例如,在一個小型的B樹中,根節點可能包含多個鍵值和少量的數據記錄,當查詢的鍵值正好在根節點時,就可以直接獲取數據。
  2. B+樹
    • B+樹的非葉子節點只存儲鍵值,不存儲數據記錄。數據記錄全部存儲在葉子節點中。這樣做的好處是,非葉子節點可以存儲更多的鍵值,從而減少樹的高度,降低磁盤I/O操作次數。例如,在一個大型的B+樹中,非葉子節點專注于存儲鍵值,形成更高效的索引結構,而葉子節點存儲數據記錄,并且通過指針連接,方便范圍查詢。

(二)查詢過程

  1. B樹
    • 進行查詢時,從根節點開始,比較鍵值與節點中的鍵值,決定進入哪個子節點。如果在非葉子節點找到目標鍵值,就可以直接獲取數據記錄,不需要繼續遍歷到葉子節點。這種查詢方式在某些情況下可能會更快地獲取數據,但也可能因為非葉子節點存儲數據記錄而導致節點空間利用不夠高效。
  2. B+樹
    • 查詢必須從根節點開始,一直遍歷到葉子節點才能找到數據記錄。雖然看起來查詢路徑可能更長,但由于B+樹的非葉子節點存儲更多鍵值,樹的高度相對較低,整體的磁盤I/O次數可能更少。而且,B+樹的葉子節點形成有序鏈表,對于范圍查詢和排序操作非常有利。

(三)范圍查詢支持

  1. B樹
    • B樹對范圍查詢的支持相對較弱。因為B樹的非葉子節點可能存儲數據記錄,且葉子節點之間沒有直接的指針連接,在進行范圍查詢時,需要不斷地回溯和遍歷不同的子樹,操作比較復雜,效率較低。
  2. B+樹
    • B+樹的葉子節點通過指針連接成一個有序的鏈表,這使得范圍查詢非常高效。例如,查詢WHERE salary BETWEEN 5000 AND 10000,在B+樹上,只需要找到第一個滿足條件的葉子節點,然后沿著鏈表依次遍歷,就可以獲取所有滿足條件的記錄,大大提高了范圍查詢的效率。

(四)插入和刪除操作

  1. B樹
    • B樹在插入和刪除操作時,需要維護樹的平衡,操作相對復雜。當插入或刪除一個鍵值時,可能會導致節點的分裂或合并,需要調整多個節點的鍵值和子節點關系。
  2. B+樹
    • B+樹的插入和刪除操作也需要維護樹的平衡,但由于其結構特點,相對B樹來說,操作可能更規則一些。例如,在插入操作中,B+樹主要在葉子節點進行插入,非葉子節點的調整相對有規律;在刪除操作中,也可以通過葉子節點的鏈表關系和非葉子節點的鍵值調整,更有效地維護樹的平衡。

(五)應用場景

  1. B樹
    • 由于B樹在某些特定場景下,非葉子節點存儲數據記錄可能會有一定優勢,例如在一些小型數據庫系統或對數據存儲密度有特殊要求的場景中可能會使用B樹。但總體來說,B樹在數據庫索引中的應用不如B+樹廣泛。
  2. B+樹
    • B+樹非常適合用于數據庫索引,尤其是在像MySQL的InnoDB存儲引擎中。它的結構特點使得查詢效率高,特別是對于范圍查詢和排序操作,能夠很好地滿足數據庫的各種查詢需求。無論是普通的單表查詢,還是多表JOIN操作,B+樹索引都能發揮重要作用。

通過以上對MySQL慢查詢定位、索引以及B樹和B+樹區別的詳細介紹,希望能幫助讀者深入理解相關知識,在實際的數據庫開發和優化中更好地應用這些內容。

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

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

相關文章

uniapp APP端在線升級(簡版)

設計思路: 1.版本比較:應用程序檢查其當前版本與遠程服務器上可用的最新版本 2. 更新狀態指示:如果應用程序是不是最新的版本,則頁面提示下載最新版本。 3.下載啟動:通過plus.downloader.createDownload()啟動新應用…

基于javaweb的SpringBoot教務課程管理設計與實現(源碼+文檔+部署講解)

技術范圍:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

使用大語言模型進行Python圖表可視化

Python使用matplotlib進行可視化一直有2個問題,一是代碼繁瑣,二是默認模板比較丑。因此發展出seaborn等在matplotlib上二次開發,以更少的代碼進行畫圖的和美化的庫,但是這也帶來了定制化不足的問題。在大模型時代,這個…

【JavaEE】MyBatis - Plus

目錄 一、快速使用二、CRUD簡單使用三、常見注解3.1 TableName3.2 TableFiled3.3 TableId 四、條件構造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定義SQL 一、快速使用 MyBatis Plus官方文檔:MyBatis Plus官方文檔…

采用前端技術開源了一個數據結構算法的可視化工具

今天要推薦的開源項目叫VisuAlgoX,是一個面向計算機科學和游戲開發的 交互式算法可視化工具,幫助用戶通過直觀的動畫理解各種數據結構和算法。 項目的前身 由于最近在做一些關于游戲和圖形化方面的文章,因此做了一部分相關算法的動態可視化來做配圖展示…

體驗智譜清言的AutoGLM進行自動化的操作(Chrome插件)

最近體驗了很多的大模型,大模型我是一直關注著ChatGLM,因為它確實在7b和8b這檔模型里,非常聰明! 最近還體驗了很多大模型的應用軟件,比如Agently、5ire、 mcphost、 Dive、 NextChat等。但是這些一般都是圖形界面或者…

pytorch中dataloader自定義數據集

前言 在深度學習中我們需要使用自己的數據集做訓練,因此需要將自定義的數據和標簽加載到pytorch里面的dataloader里,也就是自實現一個dataloader。 數據集處理 以花卉識別項目為例,我們分別做出圖片的訓練集和測試集,訓練集的標…

Blender模型導入虛幻引擎設置

單位系統不一致 Blender默認單位是米(Meters),而虛幻引擎默認使用**厘米(Centimeters)**作為單位。 當模型從Blender導出為FBX或其他格式時,如果沒有調整單位,虛幻引擎會將1米(Blen…

Docker基礎詳解

Docker 技術詳解 一、概述 Docker官網:https://docs.docker.com/ 菜鳥教程:https://www.runoob.com/docker/docker-tutorial.html 1.1 什么是Docker? Docker 是一個開源的容器化平臺,它允許開發者將應用程序和其依賴項打包到…

FastPillars:一種易于部署的基于支柱的 3D 探測器

FastPillars:一種易于部署的基于支柱的 3D 探測器Report issue for preceding element Sifan Zhou 1 , Zhi Tian 2 , Xiangxiang Chu 2 , Xinyu Zhang 2 , Bo Zhang 2 , Xiaobo Lu11{}^{1}start_FLOATSUPERSCRIPT 1 end_FLOATSUPERSCRIPT11footnotemark: 1 Chengji…

NLP語言模型訓練里的特殊向量

1. CLS 向量和 DEC 向量的區別及訓練方式 (1) CLS 向量與 DEC 向量是否都是特殊 token? CLS 向量([CLS] token)和 DEC 向量(Decoder Input token)都是特殊的 token,但它們出現在不同類型的 NLP 模型中&am…

字節跳動 UI-TARS 匯總整理報告

1. 摘要 UI-TARS 是字節跳動開發的一種原生圖形用戶界面(GUI)代理模型 。它將感知、行動、推理和記憶整合到一個統一的視覺語言模型(VLM)中 。UI-TARS 旨在跨桌面、移動和 Web 平臺實現與 GUI 的無縫交互 。實驗結果表明&#xf…

基于Python深度學習的鯊魚識別分類系統

摘要:鯊魚是海洋環境健康的指標,但受到過度捕撈和數據缺乏的挑戰。傳統的觀察方法成本高昂且難以收集數據,特別是對于具有較大活動范圍的物種。論文討論了如何利用基于媒體的遠程監測方法,結合機器學習和自動化技術,來…

【漫話機器學習系列】168.最大最小值縮放(Min-Max Scaling)

在機器學習和數據預處理中,特征縮放(Feature Scaling) 是一個至關重要的步驟,它可以使模型更穩定,提高訓練速度,并優化收斂效果。最大最小值縮放(Min-Max Scaling) 是其中最常見的方…

開源測試用例管理平臺

不可錯過的10個開源測試用例管理平臺: PingCode、TestLink、Kiwi TCMS、Squash TM、FitNesse、Tuleap、Robot Framework、SpecFlow、TestMaster、Nitrate。 開源測試用例管理工具提供了一種透明、靈活的解決方案,使團隊能夠在不受限的情況下適應具體的測…

鴻蒙闊折疊Pura X外屏開發適配

首先看下鴻蒙中斷點分類 內外屏開合規則 Pura X開合連續規則: 外屏切換到內屏,界面可以直接接續。內屏(鎖屏或非鎖屏狀態)切換到外屏,默認都顯示為鎖屏的亮屏狀態。用戶解鎖后:對于應用已適配外屏的情況下,應用界面可以接續到外屏。折疊外屏顯示展開內屏顯示折疊狀態…

DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC

drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1); 這兩行代碼用于啟用 Linux DRM(Direct Rendering Manager)客戶端的兩個關鍵特性,具體作用如下: 1. drmSetClientCap…

敏捷開發10:精益軟件開發和看板kanban開發方法的區別是什么

簡介 精益生產起源于豐田生產系統,核心是消除浪費,而看板最初是由豐田用于物料管理的信號卡片,后來被引入軟件開發。 Kanban 后來引入到敏捷開發中,強調持續交付和流程可視化。 精益軟件開發原則是基于精益生產的原則&#xff0…

用matlab探索卷積神經網絡(Convolutional Neural Networks)-3

5.GoogLeNet中的Filters 這里我們探索GoogLeNet中的Filters,首先你需要安裝GoogLeNet.在Matlab的APPS里找到Deep Network Designer,然后找到GoogLeNet,安裝后的網絡是沒有右下角的黃色感嘆號的,沒有安裝的神經網絡都有黃色感嘆號。 一個層&a…

Verilog中X態的危險:仿真漏掉的bug

由于Verilog中X態的微妙語義,RTL仿真可能PASS,而網表仿真卻會fail。 目前進行的網表仿真越來越少,這個問題尤其嚴重,主要是網表仿真比RTL仿真慢得多,因此對整個回歸測試而言成本效益不高。 上面的例子中,用Verilog RTL中的case語句描述了一個簡單的AND函數,它被綜合成AN…