MySQL 索引與事務詳解

目錄

一、索引(Index)

二、事務(Transaction)

三、總結


一、索引(Index

索引的本質:一種數據結構(如 B+TreeHash),用于快速定位數據,避免全表掃描。
核心作用:提升查詢效率,但會犧牲一定的寫性能(增刪改需維護索引)。


1. 索引類型

  • B+Tree 索引(默認)
    • 特點:支持范圍查詢、排序、最左前綴匹配。
    • 適用場景:=,?>,?<,?BETWEEN,?ORDER BY,?GROUP BY?等操作。
    • InnoDB 聚簇索引:數據直接存儲在 B+Tree 葉子節點,主鍵即聚簇索引。
    • 非聚簇索引(二級索引):葉子節點存儲主鍵值,需回表查詢數據。
  • 哈希索引
    • 特點:O(1) 時間復雜度,僅支持精確匹配(=),不支持范圍查詢。
    • 適用場景:內存表(如 MEMORY 引擎)、等值查詢頻繁的場景。
    • 限制:哈希沖突、無法排序。
  • 全文索引(FULLTEXT)
    • 特點:基于分詞技術,支持自然語言搜索。
    • 適用場景:MATCH() ... AGAINST?全文檢索(如文章內容搜索)。
    • 引擎支持:MyISAM 和 InnoDB(5.6+)。
  • 空間索引(R-Tree)
    • 適用場景:地理空間數據(如經緯度查詢)。
    • 引擎支持:MyISAM。

2. 索引創建與使用

  • 創建語法

CREATE INDEX idx_name ON table(column);????????? -- 普通索引

CREATE UNIQUE INDEX idx_name ON table(column);?? -- 唯一索引

ALTER TABLE table ADD PRIMARY KEY(column);?????? -- 主鍵索引

  • 聯合索引(復合索引)
    • 最左前綴原則:索引?(a, b, c)?可生效于?a,?a+b,?a+b+c,但無法單獨使用?b?或?c。
    • 覆蓋索引:查詢字段全部在索引中時,無需回表(性能最優)。
  • 索引失效場景
    • 對索引列進行運算或函數操作(如?WHERE YEAR(date) = 2023)。
    • 使用?LIKE?以通配符開頭(如?LIKE '%abc')。
    • 數據類型隱式轉換(如字符串列用數字查詢)。
    • OR 連接非索引列(除非所有列均有索引)。
    • 優化器認為全表掃描更快(小表或低區分度數據)。

3. 索引優化建議

  1. 選擇高區分度的列:區分度越高(如唯一鍵),過濾效果越好。
  2. 避免冗余索引:聯合索引可替代多個單列索引。
  3. 控制索引長度:使用前綴索引(如?INDEX(column(10)))減少存儲。
  4. 監控索引使用率:通過?SHOW INDEX FROM table?或?INFORMATION_SCHEMA.STATISTICS?分析。
  5. 執行計劃分析:用?EXPLAIN?查看?type(訪問類型)、key(使用索引)、Extra(是否覆蓋索引)。

二、事務(Transaction

事務的本質:一組原子性操作的集合,保證數據一致性。
ACID 特性

  • Atomicity(原子性):事務全部成功或全部回滾。
  • Consistency(一致性):事務前后數據滿足業務約束。
  • Isolation(隔離性):并發事務相互隔離。
  • Durability(持久性):事務提交后數據永久存儲。

1. 事務隔離級別

隔離級別

臟讀

不可重復讀

幻讀

實現機制

READ UNCOMMITTED

??

??

??

無鎖,直接讀最新數據

READ COMMITTED (RC)

??

??

??

快照讀(MVCC)

REPEATABLE READ (RR)

??

??

快照讀 + 間隙鎖(InnoDB)

SERIALIZABLE

??

??

??

所有操作加鎖

  • InnoDB 默認隔離級別:REPEATABLE READ(通過 MVCC + 間隙鎖解決幻讀)。
  • 幻讀:RR 級別下,通過?SELECT ... FOR UPDATE?可能觸發間隙鎖,阻止其他事務插入。

2. 事務實現機制

  • Redo Log(重做日志)
    • 作用:保證持久性,記錄物理修改(如頁的修改)。
    • 寫入流程:事務提交時先寫 redo log(順序寫,高性能),再異步刷盤。
  • Undo Log(回滾日志)
    • 作用:保證原子性,記錄數據修改前的版本,用于回滾或 MVCC。
    • 存儲位置:InnoDB 的 undo tablespace。
  • MVCC(多版本并發控制)
    • 核心思想:每個事務看到的數據快照版本不同。
    • 實現細節
      • 隱藏字段:DB_TRX_ID(事務ID)、DB_ROLL_PTR(回滾指針)。
      • ReadView:事務啟動時生成活躍事務ID列表,決定可見性。
      • RC vs RR:RC 每次讀生成新 ReadView;RR 使用事務啟動時的 ReadView。
  • 鎖機制
    • 行鎖:鎖住單行數據(如?SELECT ... FOR UPDATE)。
    • 間隙鎖(Gap Lock:鎖住索引范圍間隙,防止插入(解決幻讀)。
    • 臨鍵鎖(Next-Key Lock:行鎖 + 間隙鎖,鎖住左開右閉區間。

3. 事務最佳實踐

  1. 控制事務長度:避免長事務占用鎖資源,導致死鎖或性能下降。
  2. 明確事務邊界:業務邏輯中盡早提交或回滾。
  3. 合理選擇隔離級別:根據業務需求權衡一致性與性能。
  4. 死鎖處理
    • 設置?innodb_lock_wait_timeout?控制鎖等待超時。
    • 使用?SHOW ENGINE INNODB STATUS?分析死鎖日志。
  5. 避免隱式提交:如 DDL 語句(ALTER TABLE)會自動提交當前事務。

三、總結

  • 索引優化:根據查詢模式設計索引,權衡讀寫性能,避免過度索引。
  • 事務設計:選擇合適隔離級別,利用 MVCC 和鎖機制平衡并發與一致性。
  • 監控工具:善用?EXPLAIN、SHOW PROFILE、INFORMATION_SCHEMA?等分析性能瓶頸。

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

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

相關文章

macOS Python 環境配置指南

1. 檢查現有 Python 環境 python3 --version # 檢查 Python 3 版本 pip3 --version # 檢查 pip 版本 2. 安裝 pyenv&#xff08;Python 版本管理工具&#xff09; # 使用 Homebrew 安裝 pyenvbrew install pyenv# 配置 pyenv 環境變量&#xff08;添加到 ~/.zshrc&#…

游戲引擎學習第272天:顯式移動轉換

回顧并為今天的內容鋪墊背景 我們剛開始為游戲主角編寫一些程序邏輯&#xff0c;因為我們之前已經完成了大部分引擎方面的開發&#xff0c;現在可以專注在角色身上。這個角色的移動方式會有些特別&#xff0c;與大多數游戲角色的運動機制不太一樣。我們當前正在實現的控制方式…

軟件測試都有什么???

文章目錄 一、白盒測試&#xff08;結構測試&#xff09;二、黑盒測試&#xff08;功能測試&#xff09;三、灰盒測試四、其他測試類型五、覆蓋準則對比六、應用場景 軟件測試主要根據測試目標、技術手段和覆蓋準則進行分類。分為白盒測試、黑盒測試、灰盒測試及其他補充類型 一…

very_easy_sql(SSRF+SQL注入)

題目有一行提示&#xff1a; you are not an inner user, so we can not let you have identify~&#xff08;你不是內部用戶&#xff0c;所以我們不能讓你進行身份驗證&#xff09;聯想到可能存在SSRF漏洞&#xff0c;一般情況下&#xff0c;SSRF攻擊的目標是外網無法訪問的內…

國內外主流AI編程工具全方位對比分析(截至2025年5月)

一、國際主流工具對比 1. Windsurf&#xff08;Codeium公司&#xff09; 核心功能&#xff1a;代理型AI編程&#xff08;代碼導航/修改/命令執行&#xff09;、瀏覽器DOM訪問、網頁研究功能語言支持&#xff1a;70語言&#xff0c;包括Python/Java/JavaScript/Rust等[[22-23]…

ARP協議的工作原理

文章目錄 ARP協議的工作原理ARP報文&#xff08;以太網&#xff09;ARP高速緩存 ARP協議的工作原理 ARP協議的作用是實現任意網絡層地址到任意物理地址轉換。工作原理是&#xff1a; 主機向自己所在網絡廣播一個ARP請求&#xff0c;該請求包含目標機器的網絡地址。處于該網絡…

【小知識酷】《Matlab》考點精簡

在線編譯器 https://matlab.mathworks.com/?elqsidumic49viv8wu5r6fckew 第1章 matlab基礎知識 第1節 輸出函數 1. 使用disp函數 disp函數可用于輸出變量的值或者字符串。 % 輸出字符串 disp(Hello, MATLAB!); %顯示Hello, MATLAB!% 輸出變量 x 10; disp(x); %顯示10% 輸出數…

碼蹄集——中庸之道(三個數比較)

MT1112 中庸之道 請編寫一個簡單程序&#xff0c;輸入3個整數&#xff0c;比較他們的大小&#xff0c;輸出中間的那個數 格式 輸入格式&#xff1a; 輸入整型&#xff0c;空格分隔 輸出格式&#xff1a;輸出整型 樣例 1 輸入&#xff1a;1 5 3 輸出&#xff1a;3 比較…

快速搭建一個vue前端工程

一、環境準備 1、安裝node.js 下載地址&#xff1a;Node.js 推薦版本如下&#xff1a; 2、檢查node.js版本 node -v npm -v 二、安裝Vue腳手架 Vue腳手架是Vue官方提供的標準化開發工具。vue官網&#xff1a;https://cn.vuejs.org/ 全局安裝vue/cli &#xff08;僅第一次…

React Native基礎環境配置

React Native基礎環境配置 1.引言2.React-Native簡介3.項目基礎環境搭建1.引言 感覺自己掌握的知識面還是有點太窄了,于是決定看看移動端的框架,搞個react搭一個后端管理項目,然后拿react-native寫個小的軟件,試著找個三方上架一下應用市場玩玩。畢竟不可能一直在簡歷上掛一…

PHP和Composer 安裝

Composer 是 PHP 的 依賴管理工具&#xff0c;就像&#xff1a; Node.js 用 npm Python 用 pip Java 用 maven 用來安裝和管理 PHP 項目中需要用到的第三方庫 安裝PHP可以理解成 Java解釋器 安裝PHP PHP For Windows: Binaries and sources Releaseshttps://windows.php.n…

API請求參數有哪些?

通用參數 app_key&#xff1a;應用的唯一標識&#xff0c;用于驗證應用身份&#xff0c;調用API時必須提供。 timestamp&#xff1a;請求時間戳&#xff0c;通常為當前時間的毫秒級時間戳&#xff0c;用于防止請求被重放攻擊。 format&#xff1a;返回數據的格式&#xff0c;…

并發筆記-條件變量(三)

文章目錄 背景與動機30.1 條件變量的定義與基本操作 (Definition and Routines)30.2 生產者/消費者問題 (Bounded Buffer Problem)30.3 覆蓋條件 (Covering Conditions) 與 pthread_cond_broadcast30.4 總結 背景與動機 到目前為止&#xff0c;我們已經學習了鎖 (Locks) 作為并…

stm32實戰項目:無刷驅動

目錄 系統時鐘配置 PWM模塊初始化 ADC模塊配置 霍爾接口配置 速度環定時器 換相邏輯實現 主控制循環 系統時鐘配置 啟用72MHz主頻&#xff1a;RCC_Configuration()設置PLL外設時鐘使能&#xff1a;TIM1/ADC/GPIO時鐘 #include "stm32f10x.h"void RCC_Configu…

LC-3 中常見指令

當然可以&#xff01;以下是 LC-3 中常見指令&#xff08;匯編格式&#xff09;與對應的二進制編碼格式 的總結表&#xff0c;通俗易懂地介紹每條指令的用途、操作碼&#xff08;opcode&#xff09;以及格式結構。 ? 常見 LC-3 指令與對應的二進制格式 指令名稱操作碼&#x…

深入解析Docker:核心架構與最佳實踐

文章目錄 前言一、Docker 解決了什么問題&#xff1f;二、Docker 底層核心架構2.1 Docker 引擎的分層架構2.2 鏡像的奧秘&#xff1a;聯合文件系統&#xff08;UnionFS&#xff09;2.3 容器隔離的核心技術2.3.1 命名空間2.3.2 控制組&#xff08;Cgroups&#xff09;2.3.3 內核…

從零打造企業級Android木馬:數據竊取與遠程控制實戰

簡介 木馬病毒已從簡單的惡意軟件演變為復雜的攻擊工具,尤其在2025年企業級攻擊中,木馬病毒正成為黑客組織的主要武器之一。 本文將深入探討如何制作具備數據竊取和遠程控制功能的Android木馬,從基礎原理到企業級防御繞過技術,同時提供詳細的代碼實現,幫助開發者理解木馬…

ES常識5:主分詞器、子字段分詞器

文章目錄 一、主分詞器&#xff1a;最基礎的文本處理單元主分詞器的作用典型主分詞器示例 二、其他類型的分詞器&#xff1a;解決主分詞器的局限性1. 子字段分詞器&#xff08;Multi-fields&#xff09;2. 搜索分詞器&#xff08;Search Analyzer&#xff09;3. 自定義分詞器&a…

【第三十五周】Janus-pro 技術報告閱讀筆記

Janus-Pro 摘要Abstract文章信息引言方法Janus 架構Janus 訓練Janus-Pro 的改進 實驗結果總結 摘要 本篇博客介紹了Janus-Pro&#xff0c;這是一個突破性的多模態理解與生成統一模型&#xff0c;其核心思想是通過解耦雙路徑視覺編碼架構解決傳統方法中語義理解與像素生成的任務…

MySQL 數據操縱與數據庫優化

MySQL數據庫的DML 一、創建&#xff08;Create&#xff09; 1. 基本語法 INSERT INTO 表名 [(列名1, 列名2, ...)] VALUES (值1, 值2, ...); 省略列名條件&#xff1a;當值的順序與表結構完全一致時&#xff0c;可省略列名&#xff08;需包含所有字段值&#xff09;批量插…