Sql Server 索引性能優化 分析以及分表

定位需優化語句
  1. 根據工具 skywking 或者開啟慢查詢日志 找到 慢sql 的語句
  2. 根據 ==執行過程 ==來 判斷 慢的原因
    row filter 指標 看查了多少數據 比例多少
    type 看下是單表 還是 join聯表
    比如 執行步驟多 沒索引
優化方向
  1. 減少執行次數
  2. 索引 沒索引考慮加索引 加索引 盡量選擇 int 字節小 或者字符串如果能控制就固定 比如 name varchar(20就夠的話 就不要100)這樣 索引頁存儲 索引值多 因為涉及到 的概念 非聚集索引盡量覆蓋索引 減少RID 回表的情況
  3. 加了索引的話 考慮是否失效
  4. 有索引使用性能還是不行 考慮一下 是不是IO 頻率次數多引起的 比如 頁碎片 行溢出
  5. 性能還是不行的話 就考慮 =分表分庫 減少這個IO頻率
索引設置層面優化點

索引設置 所以最好就是int 如果是 varchar 固定大小 時間索引也要固定大小
索引失效情況

  1. sql 語句不妥 用了 or 另一字段沒有索引 需要or的字段也要有索引
  2. 用了 like %在前面 沒有索引
    可以覆蓋索引 select * from table where id like ‘1%’ 改為 select id from table where id like ‘1%’ 用id 覆蓋 索引
    或者 %寫后面
  3. 用函數
  4. 聯合索引 主次 順序 次的 不走索引
  5. 字段可否為空 與 is not null 有關系 沒設置 寫的話 不走索引
頁、區
  1. 頁(Page)——數據存儲的“書頁”?
    ?定義
    頁是 SQL Server 中數據存儲的最小單位,類似于一本書中的一頁紙。?每個頁固定大小為 8KB?(8,192字節),所有數據(包括表數據、索引、系統信息)均以頁為單位存儲和讀取。
    ?頁的結構
    每個頁由三部分組成(見圖1):
    ?頁頭(96字節)?:存儲系統信息(如頁碼、頁類型、可用空間等)。
    ?數據區(約8,000字節)?:存放實際數據行或索引條目。
    ?行偏移表(行指針)?:記錄每行數據的起始位置,類似書頁的“頁碼索引”,從頁尾向前倒序排列。
    ?類比:想象一頁紙,頁頭是標題和作者信息,數據區是正文內容,行偏移表是每段文字在頁中的位置索引。

  2. ?頁的類型
    ?數據頁:存儲用戶表的具體數據行(如 varchar、int 等普通列)。
    ?索引頁:存儲索引結構(如 B+ 樹的中間節點),幫助快速定位數據。
    ?特殊頁:如管理空間分配的 GAM/SGAM 頁、記錄大文本的 Text/Image 頁等。

  3. 區(Extent)——管理頁的“章節”?
    ?定義
    區是 ?8個連續頁的集合?(共64KB),用于高效管理頁的分配。相當于將多個書頁裝訂成章,避免零散存儲。
    ?區的類型
    ?混合區:區內的8個頁可分配給不同對象(如表、索引)。?新創建的小表默認使用混合區,節省空間。
    ?統一區:區內的8個頁專屬于同一個對象。?當表或索引增長到8頁以上時,自動升級為統一區,提高連續讀寫效率。
    ?類比:混合區像共享辦公室,多個租戶共用;統一區像獨立辦公室,僅供一家公司使用

索引頁與數據頁
  1. 數據頁(Data Page)——存放“書的內容” 也就是表中行數據存儲
    存儲實際數據行,例如:
CREATE TABLE Students (ID INT, Name VARCHAR(50), Age INT);| 頁頭 | ID=1, Name="Alice", Age=20 | ID=2, Name="Bob", Age=22 | ... | 行偏移表 |

行溢出:如果某行數據太大(超過 8060B),部分內容會存到其他頁(類似書太厚,分上下冊)。

  1. 索引頁(Index Page)——存放“書的目錄” 也就是表設置的 聚集索引或者 非聚集索引

2.1 聚集索引(主鍵索引)
葉子節點是數據頁:數據按主鍵順序物理存放(類似書按編號順序排列)。
非葉子節點是索引頁:存儲鍵值范圍和子頁指針(類似目錄的章節導航)。

也就是說 索引頁然后找到 葉子數據頁 然后根據行數直接找到數據

 [索引頁(根)]/      |      \
[索引頁(中間)] ... [索引頁(中間)]/     |     \             ...
[數據頁] [數據頁] [數據頁]  

2.2 非聚集索引(普通索引)
葉子節點指向數據頁:存儲索引鍵值 + 行定位符(RID 或主鍵值),回表查詢數據(類似書末的索引表,標注“主題→頁碼”)。

也就是說 索引頁找到葉子頁這些都是索引頁的內容,然后通過聚集索引建或RID 回表找到數據
也就是說 非聚集索引 過程多了一步 聚集索引建或RID 回表

        [索引頁(根)]/     |     \
[索引頁(中間)] ... [索引頁(中間)]/    |    \           ...
[葉子頁(存RID] ... [葉子頁(存RID]

總結
?頁是存儲的基本單位(8KB),?區是管理頁的集合(8頁=64KB)。
?數據頁直接存數據,?索引頁加速查詢,兩者通過B+樹和指針協作

頁碎片 行溢出 區分配策略

在使用的過程中肯定會有數據操作,那么 增刪改查 勢必會對頁中的數據存儲有一定影響。
數據少了 空間沒用完,數據多了空間不夠用就會出現以下這些情況。

碎片(Fragmentation)?
碎片分為 ?內部碎片 和 ?外部碎片,影響查詢性能和存儲效率。

  1. ?內部碎片
    ?定義:頁內未充分利用的空閑空間(如刪除數據后留下的空白)。
    ?影響:浪費存儲空間,增加讀取時的 I/O 操作(需掃描更多頁)。
    ?示例:若某頁實際存儲數據僅占 50%,剩余空間無法被其他數據利用。
    ?優化:通過 ALTER INDEX REBUILD 或 REORGANIZE 整理頁內空間。
  2. ?外部碎片
    ?定義:頁在磁盤上物理不連續(由分頁操作導致)。
    ?觸發場景:插入或更新數據時原頁空間不足,新頁與舊頁物理分離。
    ?影響:范圍查詢需跨區讀取,增加磁頭移動和 I/O 開銷。
    ?優化:使用 ALTER INDEX REBUILD 重建索引,或調整填充因子減少分頁頻率。
    ?

填充因子(Fill Factor)?

  1. 作用:控制頁初始填充比例(默認 100%),預留空間減少分頁。
    ?設置建議:
    讀寫比 > 100:1 → 100%填充(減少查詢 I/O)。
    寫頻繁 → 50%-70%填充(減少分頁)。
    讀寫平衡 → 80%-90%填充。

行溢出(Row Overflow)?
?觸發條件
變長列(如 varchar(max))數據超過頁容量(8KB)。
行總大小(含系統信息)超過 8060 字節。
?存儲機制

?行溢出指針:原頁中保留 24 字節指針,指向溢出頁(存儲實際數據)。

  1. ?結構示例:
    原頁中記錄包含溢出指針(如 0x70170000 表示溢出數據長度 6000 字節)。
    溢出頁獨立存儲數據,與原頁通過 RID(行標識符)關聯。
    ?性能影響
    增加隨機 I/O(需讀取多個頁)。
    建議優化表結構,避免頻繁行溢出(如拆分大字段或使用 LOB 類型)。
    ?四、區分配策略(Extent Allocation)?

?區的類型

  1. ?混合區:區內的 8 個頁分配給不同對象(適合小表初始分配)。
  2. ?統一區:區內的 8 頁專屬于同一對象(適用于大表或索引)。
  3. ?分配規則
    ?默認策略:
    新對象(<8頁)使用混合區(節省空間)。
    對象增長到 8 頁后,轉為統一區(提升連續讀寫性能)。
    ?管理機制:
    ?GAM(全局分配映射表)?:標記區是否已分配(0=已分配,1=可用)。
    ?SGAM(共享全局分配映射表)?:標記混合區是否有空閑頁(1=有可用頁)。
  4. ?優化場景
    ?小表頻繁插入:混合區減少空間浪費。
    ?大表范圍查詢:統一區提高順序 I/O 效率。
    ?總結
    ?頁是存儲基礎單元,?碎片分為內部(頁內空間浪費)和外部(頁物理不連續),通過重建索引或調整填充因子優化。
    ?行溢出通過指針鏈接溢出數據,需權衡表設計避免性能損耗。
    ?區分配策略通過混合區與統一區的動態切換,平衡空間利用與 I/O 效率。
    實際應用中需結合 sys.dm_db_index_physical_stats 監控碎片,按業務場景調整策略

關鍵優化點
?頁碎片:頻繁增刪數據會導致頁不連續,增加磁盤I/O。可通過重建索引調整空間 ALTER INDEX REBUILD 整理。
?行溢出:變長列(如 varchar(max))超過8KB時會拆分到其他頁,需謹慎設計表結構。
?區分配策略:小表優先使用混合區,大表使用統一區提升性能。

設計數據庫時需關注頁/區分配策略和碎片問題,以優化性能

SQL Server RID 回表詳解

回表是針對 表 沒有 聚集索引的情況下,非聚集索引怎么去尋找數據的,如果有 聚集索引,就不用通過RID回表直接去 跟著 聚集索引建 流程去數據頁找數據

  1. 什么是 RID 回表?
    RID(Row Identifier):當表 沒有聚集索引(堆表)時,SQL Server 為每一行數據分配的唯一物理地址,格式為 (文件號:頁號:槽號)。
    回表(Bookmark Lookup):通過非聚集索引找到 RID 后,根據 RID 定位到數據頁獲取完整數據行的過程。
    類比理解:
    想象一本書的末尾有一個“關鍵詞索引”,每個關鍵詞后面標注了對應的頁碼(類似 RID)。回表就像根據頁碼翻到正文頁面讀取完整內容。

  2. 為什么需要回表?
    非聚集索引的局限性:
    非聚集索引的葉子節點 只存儲索引鍵值和 RID(或聚集索引鍵),不包含其他列的數據。
    若查詢需要返回非索引列,必須通過 RID 回表讀取數據頁
    示例:
    表結構:

CREATE TABLE Students (StudentID INT PRIMARY KEY NONCLUSTERED,  -- 非聚集主鍵Name VARCHAR(50),Age INT
);
SELECT Name, Age FROM Students WHERE StudentID = 100;
非聚集索引 StudentID 的葉子節點只有 StudentID 和 RID。為了獲取 Name 和 Age,必須通過 RID 回表到數據頁
如何判斷 SQL Server 索引頁和數據頁的使用情況 以及是否需要分表
  1. 通過系統視圖和 DMV 獲取索引頁數量
    ?核心工具:sys.dm_db_index_physical_stats
    該動態管理視圖直接提供索引的物理存儲信息,包括索引頁數量、碎片率、層級等。
SELECTOBJECT_NAME(object_id) AS TableName,index_type_desc AS IndexType,index_level AS IndexLevel,page_count AS TotalPages,record_count AS TotalRows,avg_fragmentation_in_percent AS Fragmentation
FROMsys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED')
WHEREindex_type_desc IN ('CLUSTERED', 'NONCLUSTERED');
  1. ?關鍵字段解釋:
    index_type_desc:區分聚集索引(CLUSTERED)和非聚集索引(NONCLUSTERED)。
    index_level:索引層級(0為葉級,>0為非葉級)。
    page_count:當前層級的頁數。
    avg_fragmentation_in_percent:碎片率

?聚集索引的葉級頁(index_level=0)是數據頁,非葉級頁(如根、中間節點)是索引頁;非聚集索引的所有頁均為索引頁

?統計索引頁總數
?聚集索引:總索引頁數 = 根頁數(index_level=最高層級) + 中間層級頁數(index_level>0)。
?非聚集索引:總索引頁數 = 所有層級的 page_count 之和(包括葉級和非葉級)。

單表總數據量

SELECT SUM(p.rows) AS TotalRows,SUM(au.total_pages) * 8 / 1024 AS TotalSpaceMB  -- 總空間(MBFROM sys.partitions p
INNER JOIN sys.allocation_units au ON p.hobt_id = au.container_id
WHERE p.object_id = OBJECT_ID('YourTableName');

索引頁數量的存儲原理

  1. 聚集索引的索引頁
    ?結構:B+樹結構,葉級是數據頁,非葉級是索引頁(存儲鍵值和指針)。
    ?計算示例:
    假設根頁(1頁)指向中間層(7頁),中間層指向葉級數據頁(4000頁),則總索引頁數為 1+7=8 頁,數據頁為 4000 頁。
    ?唯一性影響:唯一聚集索引的索引頁更少,而非唯一聚集索引可能因添加 uniqueifier 列增加頁數。
  2. ?非聚集索引的索引頁
    ?結構:獨立于數據頁,葉級存儲鍵值 + 書簽(聚集索引鍵或堆表 RID),非葉級存儲導航鍵值。
    ?頁數計算:總索引頁數 = 根頁 + 中間層頁 + 葉級頁。
    例如:某非聚集索引根頁 1 頁、中間層 7 頁、葉級 179 頁,總索引頁數為 1+7+179=187 頁。

實際案例與優化建議

  1. 案例:索引頁分布分析
    ?聚集索引:若某表總頁數為 4020 頁,其中數據頁 4009 頁,索引頁(根+中間層)為 11 頁。
    ?非聚集索引:若覆蓋索引(包含查詢所需列)的葉級頁數占比高,可能減少回表操作。
  2. 優化建議
    ?監控碎片:高碎片率(如 avg_fragmentation_in_percent > 30%)需重建索引以減少頁數。
    ?填充因子調整:寫頻繁的表可降低填充因子(如 70%),預留空間減少頁分裂
分表

判斷是否需分表的依據

  1. 數據量閾值
    常規場景:
    單表數據行數 > 5000萬 或 存儲空間 > 500GB,考慮分表。
    索引頁占比過高(如索引頁占總頁數 >40%),需優化索引或分表。
    高并發場景:
    頻繁出現頁鎖競爭(通過 sys.dm_tran_locks 監控),需水平分表。

  2. 性能指標
    查詢延遲:關鍵查詢響應時間超過業務容忍閾值(如 >1秒)。
    I/O 瓶頸:通過 sys.dm_io_virtual_file_stats 發現數據文件讀寫延遲高。

  3. 維護成本
    索引維護時間:重建索引耗時過長(如 >1小時),影響業務可用性。
    備份/恢復時間:單表過大導致備份窗口無法接受。

分表策略選擇

  1. 水平分表(按行拆分)
    適用場景:數據按時間、地域、哈希等邏輯可分割。
    實現方式:
    按時間分表:Order_2023、Order_2024。
    按哈希分表:對主鍵哈希取模,分散到多個表
-- 創建分表(按年份)
CREATE TABLE Orders_2023 (OrderID INT PRIMARY KEY,OrderDate DATETIME,CustomerID INT,...
) ON FileGroup2023;CREATE TABLE Orders_2024 (OrderID INT PRIMARY KEY,OrderDate DATETIME,CustomerID INT,...
) ON FileGroup2024;-- 使用視圖統一訪問
CREATE VIEW AllOrders AS
SELECT * FROM Orders_2023
UNION ALL
SELECT * FROM Orders_2024;
  1. 垂直分表(按列拆分)
    適用場景:表包含大量不常訪問的列(如 BLOB 字段)。
    實現方式:
    將高頻訪問列(如 ID, Name)拆分到主表。
    低頻列(如 Description, Logs)拆分到擴展表
-- 主表(高頻字段)
CREATE TABLE Users (UserID INT PRIMARY KEY,UserName VARCHAR(50),Email VARCHAR(100)
);-- 擴展表(低頻字段)
CREATE TABLE UserDetails (UserID INT PRIMARY KEY,Address NVARCHAR(200),ProfileText TEXT,FOREIGN KEY (UserID) REFERENCES Users(UserID)
);

分表后的優化建議

  1. 分區方案(Partitioning)
    使用 SQL Server 內置分區功能,按范圍或列表分區,避免手動分表。
    支持跨分區查詢,簡化管理。
    應用層路由
    在應用代碼中根據分表鍵(如時間、用戶ID)路由到具體表。
    統一查詢接口
    使用視圖或存儲過程封裝分表細節,對上層透明

在這里插入圖片描述

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

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

相關文章

@JsonSerialize注解

1.簡介 JsonSerialize注解可以自定義改變返回前端的內容,比如:將Student實體類的age字段的值在返回前端之前,由20改為21. 要用到jackson-databind依賴包,在Spring Boot項目中&#xff0c;默認已經集成了Jackson&#xff0c;因此你不需要手動引入Jackson庫。 2.上例子 將Stud…

Java面試黃金寶典5

1. ConcurrentHashMap 和 HashTable 有哪些區別 原理 HashTable&#xff1a;它繼承自 Dictionary 類&#xff0c;是 Java 早期提供的線程安全哈希表。其線程安全的實現方式是對每個方法都使用 synchronized 關鍵字進行同步。例如&#xff0c;在調用 put、get 等方法時&#xff…

vim的一般操作(分屏操作) 和 Makefile 和 gdb

目錄 一. vim的基本概念 二. vim基礎操作 2.1 插入模式 aio 2.2 [插入模式]切換至[正常模式] Esc 2.3[正常模式]切換至[末行模式] shift ; 2.4 替換模式 Shift R 2.5 視圖&#xff08;可視&#xff09;模式 (可以快速 刪除//注釋 或者 增加//注釋) ctrl v 三&…

Linux:基礎IO---文件描述符

文章目錄 1. 前言1.1 C語言文件知識回顧 2. 文件2.1 文件基礎知識 3. 被打開的文件3.1 以C語言為主&#xff0c;先回憶一下C文件接口3.2 過渡到系統&#xff0c;認識文件系統調用3.3 訪問文件的本質3.4 重定向&&緩沖區 序&#xff1a;在深入了解了進程的內容后&#xf…

2025年十大AI工具對比

2025年十大AI工具對比 以下是2025年各大AI工具的詳細對比&#xff0c;涵蓋性能、功能、用戶評價等方面&#xff0c;并以表格形式呈現。數據來源于多個權威來源&#xff0c;確保信息全面且準確。 對比表格 排名AI工具名稱主要功能性能特點用戶評價適用場景1DeepSeek多模態AI、…

JDK 24 發布,新特性解讀!

一、版本演進與技術格局新動向 北京時間3月20日&#xff0c;Oracle正式發布Java SE 24。作為繼Java 21之后的第三個非LTS版本&#xff0c;其技術革新力度遠超預期——共集成24項JEP提案&#xff0c;相當于Java 22&#xff08;12項&#xff09;與Java 23&#xff08;12項&#…

批量圖片壓縮工具,高效減小文件大小并保持質量

在處理大量圖片時&#xff0c;如何高效壓縮文件大小并保持畫質是個常見難題。今天為大家推薦一款專業工具——JPGC&#xff0c;它專為圖片批量處理設計&#xff0c;能快速壓縮JPG/JPEG格式圖片&#xff0c;在減小文件體積的同時盡可能保留畫質&#xff0c;尤其適合處理數碼相機…

【002安卓開發方案調研】之Kotlin+Jetpack開發方案

基于2025年國內移動開發領域的現狀&#xff0c;結合Jetpack Compose的技術特性和生態發展&#xff0c;以下是對KotlinJetpack Compose開發安卓應用的綜合分析&#xff1a; 一、技術與生態成熟度評估 1. 技術成熟度 聲明式UI與開發效率 Jetpack Compose采用聲明式編程模型&…

軟考中級-軟件設計師 準備

軟考中級-軟件設計師 準備 一、軟考相關1.1、考試時間1.2、考試時長1.3、題型和分值&#xff1a; 二、軟考備考2.1、相關書籍2.2、推薦課程&#xff1a;B站up主zst_20012.3、學習路線 一、軟考相關 1.1、考試時間 一年有兩次軟考&#xff0c;一般是五月末和十一月的中旬 以下…

【數據挖掘】Python基礎環境安裝配置

【數據挖掘】Python基礎環境安裝配置 一、摘要二、安裝Python3.13.2三、安裝Jupyter Notebook四、安裝Numpy和Pandas以及matplotlib五、安裝scikit-learn庫和seaborn庫 一、摘要 本文主要介紹如何在Windows上安裝Python3.13.2&#xff0c;然后基于該Python版本安裝Jupyter not…

給語言模型增加知識邏輯校驗智能,識別網絡中的信息投毒行為模式

目前階段&#xff0c;現在的LLM缺少一個形式邏輯校驗模型。 網絡系統上不斷增長的信息相當部分不再純粹是人類生成&#xff0c;而是也由各種模型生成輸出&#xff0c;模型后續從網絡系統上取得信息&#xff0c;AI生態系統陷入了信息熵增循環&#xff0c;AI模型生態系統的計算輸…

OpenLayers集成天地圖服務開發指南

以下是一份面向GIS初學者的OpenLayers開發詳細教程&#xff0c;深度解析代碼&#xff1a; 一、開發環境搭建 1.1 OpenLayers庫引入 <!-- 使用CDN引入最新版OpenLayers --> <link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/ollatest/ol.c…

【免費】2000-2019年各省地方財政房產稅數據

2000-2019年各省地方財政房產稅數據 1、時間&#xff1a;2000-2019年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;行政區劃代碼、地區、年份、地方財政房產稅 4、范圍&#xff1a;31省 5、指標說明&#xff1a;房產稅是對個人和單位擁有的房產征收的一種…

在Ubuntu 22.04 中安裝Docker的詳細指南

在Ubuntu 22.04 中安裝Docker的詳細指南 一、引言 Docker是一個開源的應用容器引擎&#xff0c;它可以讓開發者將應用程序及其依賴項打包到一個可移植的容器中&#xff0c;然后發布到任何流行的Linux機器上&#xff0c;也可以實現虛擬化。在Ubuntu 22.04上安裝Docker能為開發、…

macOS 使用 iconv 轉化文件編碼

文章目錄 使用方式支持的編碼類型iconv 更多用法 使用方式 iconv -f GB2312 -t UTF-8 分治算法.txt > 分治算法2.txt 支持的編碼類型 可以使用 下面命令 查看編碼類型 iconv -lPS : ISO-8859 有很多種分支&#xff0c;iconv 支持 ISO-8859-1、ISO-8859-10&#xff0c;但…

操作系統核心問題解析(目的/定位、管理思想:先描述,再組織、 庫函數與系統調用的關系)

1. 目的/定位 核心作用&#xff1a;操作系統是計算機系統的資源管理者和用戶/應用程序的服務提供者。 資源管理&#xff1a;統一管理CPU、內存、磁盤、外設等硬件資源&#xff0c;避免沖突、提高利用率&#xff08;如多任務調度、虛擬內存&#xff09;。 服務接口&#xff1a…

使用Python將視頻轉化為gif

使用Python將視頻轉化為gif 一、前言二、準備三、測試 一、前言 最近想把喜歡的視頻片段作成gif&#xff0c;就試著用Python做了下&#xff0c;感覺效果還行&#xff0c;這里做個記錄。 二、準備 先下載安裝對應的庫&#xff0c;命令如下&#xff1a; pip install moviepy …

Python模塊化設計 ——函數調用

1.以下代碼的輸出結果是()。 def young(age): if 25 <=age<=30: print(“作為一個老師,你很年輕”) elif age <25: print(“作為一個老師,你太年輕了”) elif age>=60: print(“作為一個老師,你可以退休了”) else: print(“作為一個老師,你很有愛心”) young(42) …

在 Linux下使用 Python 3.11 和 FastAPI 搭建帶免費證書的 HTTPS 服務器

在當今數字化時代&#xff0c;保障網站數據傳輸的安全性至關重要。HTTPS 協議通過使用 SSL/TLS 加密技術&#xff0c;能夠有效防止數據在傳輸過程中被竊取或篡改。本教程將詳細介紹如何在 Ubuntu 22.04 系統上&#xff0c;使用 Python 3.11 和 FastAPI 框架搭建一個帶有免費 SS…

MySQL 事務(Transaction)詳解

MySQL 事務&#xff08;Transaction&#xff09;詳解 1. 什么是事務&#xff1f; 事務&#xff08;Transaction&#xff09;是一組要么全部執行&#xff0c;要么全部回滾的 SQL 語句&#xff0c;用于保證數據一致性。事務一般用于銀行轉賬、訂單支付等操作&#xff0c;確保多個…