MySQL八股篇

查詢關鍵字執行先后順序
  • FROM(及 JOIN)

  • WHERE

  • GROUP BY

  • HAVING

  • SELECT

  • DISTINCT

  • ORDER BY

  • LIMIT / OFFSET

CHAR 和 VARCHAR 的區別?使用場景?
特性CHARVARCHAR
?存儲方式??定長,存儲時填充空格至定義長度變長,存儲實際數據 + 長度前綴
?空間占用??固定(可能浪費空間)動態(節省空間)
??讀取性能??高(無需解析長度,直接讀取固定長度)較低(需解析長度前綴)
?適用場景??長度固定的字段(如編碼、枚舉)長度不固定的文本(如描述、地址)
MySQL窗口函數是什么

對數據集劃分窗口(比如按組、按排序范圍),在窗口內計算并返回每行對應的結果,??不聚合數據??,保留所有行

explain語句執行后生成的表重要字段含義
字段含義常見取值 / 說明
type訪問類型(效率從好到差)system > const > eq_ref > ref > range > index > ALL
key實際使用的索引索引名,如 idx_amountNULL 表示未命中索引(全表掃描)
rows優化器估算需掃描的行數數值越大,意味著掃描量越大,通常要盡量降低
Extra額外操作信息Using whereUsing index(覆蓋索引)、Using filesortUsing temporary
索引是什么?有什么好處?
  • 是一種能高效獲取數據的數據結構

  • 可以提高數據檢索效率,降低數據庫的 I/O 成本

  • 可以對數據進行排序,降低數據排序的成本,減少CPU的消耗

MySQL 索引失效的情況
  • 模糊匹配時 % 開頭
SELECT * FROM tbl WHERE name LIKE '%ohn';
  • 對列進行函數運算或表達式計算
SELECT * FROM tbl WHERE DATE(created_at) = '2025-06-27';
  • 字符串值不加引號,索引失效
-- phone 不加引號,索引失效
explain select * from tb_user where phone = 17799990015;
  • or 兩邊條件,一邊有索引,一邊無索引,索引失效
-- id 有索引、age 無索引,索引失效
explain select * from tb_user where id = 10 or age = 23; 
MySQL索引使用會出現什么問題?該怎么解決?

問題:

  • 索引維護成本高,影響寫入性能, 解決: 減少索引數量, 批量提交寫入操作,減少索引更新次數

  • 索引未被使用(索引失效), 解決: 優化查詢語句

  • 索引占用過多磁盤空間 , 解決: 精簡索引字段,清除無用索引

?

? 事務四大特性(ACID)及實現原理??
?特性???描述????實現原理??
??原子性事務要么全部成功,要么全部回滾通過回滾日志(?Undo Log)實現??
?一致性 ?事務執行前后數據庫的完整性約束不變通過持久性+原子性+隔離性實現
??隔離性 ?并發事務之間互不干擾??通過鎖機制??和 ?MVCC?(?多版本并發控制)實現
??持久性 ?事務提交后數據永久保存?通過重做日志(Redo Log)實現
?并發事務問題??

并發事務可能導致臟讀、不可重復讀和幻讀

  • 臟讀是指一個事務讀到了另一個事務未提交的“臟數據”
  • 不可重復讀是指在一個事務內多次讀取同一數據,由于其他事務的修改導致數據不一致
  • 幻讀是指一個事務讀取到了其他事務插入的“幻行”
?事務隔離級別及實現原理??
??隔離級別????臟讀???不可重復讀????幻讀????實現原理??
??讀未提交???無鎖,直接讀取最新數據(包括未提交的數據)
?讀已提交 ???????MVCC??:每次查詢生成獨立的ReadView,僅讀取已提交的數據版本
??可重復讀 ???????MVCC??:事務首次查詢生成ReadView,后續復用該視圖(MySQL默認隔離級別
??串行化???????鎖機制??:所有操作加鎖,事務串行執行
事務隔離級別,每個級別會引發什么問題,MySQL 默認是哪個級別?
  • MySQL 默認事務隔離級別是可重復讀

事務隔離級別引發的問題:

隔離級別描述可能出現的問題
READ UNCOMMITTED(讀未提交)允許讀取其他事務未提交的數據。臟讀、不可重復讀、幻讀
READ COMMITTED(讀已提交)只能讀取其他事務已提交的數據。不可重復讀、幻讀
REPEATABLE READ(可重復讀)同一事務中多次讀取的數據一致。幻讀
SERIALIZABLE(串行化)強制事務串行執行,完全隔離。無,但性能較低,可能導致并發性差
MySQL 常見的三種存儲引擎(InnoDB、MyISAM、MEMORY)的區別?
特性InnoDBMyISAMMEMORY
事務支持不支持不支持
鎖機制支持行級鎖, 適合高并發讀寫場景支持表級鎖,適合讀多寫少、簡單查詢場景支持表級鎖,適合臨時高速緩存表
外鍵與完整性支持外鍵約束不支持外鍵不支持外鍵
崩潰恢復支持崩潰恢復無崩潰恢復機制不支持恢復
  • InnoDBMySQL 5.5 開始為默認存儲引擎,綜合事務處理能力和恢復性能最好。適合高并發讀寫、事務處理要求高的場景

  • MyISAM 適合讀操作多、寫操作較少, 對事務和數據完整性要求不高的場景

  • MEMORY 引擎速度最快,只作為短期緩存或臨時表使用,不用于持久化業務數據

什么是聚簇索引什么是非聚簇索引?
  • 聚簇索引是指數據與索引放在一起,B+ 樹的葉子節點保存了整行數據,通常只有一個聚簇索引,一般是由主鍵構成

  • 非聚簇索引則是數據與索引分開存儲,B+樹的葉子節點保存的是主鍵值,可以有多個非聚簇索引

回表查詢是什么?

指的是通過二級索引找到對應的主鍵值,然后再通過主鍵值查詢聚簇索引中對應的整行數據的過程

MySQL 中為什么推薦使用連接查詢而不是子查詢?

連接查詢比子查詢更高效、可讀性更好, 因為連接查詢不需要額外的中間臨時表,但是子查詢有中間臨時表

什么叫覆蓋索引?
  • 指的是在 SELECT 查詢中,返回的列都能在索引中找到

  • 好處: 避免了回表查詢,提高了性能。使用覆蓋索引可以減少對主鍵索引的查詢次數,提高查詢效率

表的查詢速度很慢,怎么解決?
  • 使用 explain 分析 sql 語句,找出原因

  • 創建, 優化索引

  • 優化數據庫表,如果表數據量過大,可以拆成多張表

  • 使用緩存

索引創建原則?
  • 表中的數據量超過 10萬 以上時考慮創建索引

  • 選擇查詢頻繁的字段作為索引,如查詢條件、排序字段或分組字段

  • 對于內容較長的字段使用前綴索引

  • 控制索引數量,雖然索引可以提高查詢速度,但會影響插入、更新的速度

  • 盡量使用聯合索引,覆蓋 SQL 的返回值, 比如查詢 WHERE user_id=100 AND status=1,創建(user_id, status)的聯合索引,比單獨給兩個字段建索引更能精準定位數據, 如果復合索引包含了 SELECT 語句需要返回的所有字段(如SELECT id, name FROM t WHERE user_id=100,索引設為(user_id, id, name)),數據庫可以直接從索引中獲取數據,無需再去表中查詢(避免 “回表” 操作),大幅減少 IO 開銷

SQL的優化手段
  • 建表時選擇合適的字段類型

  • 使用索引,優化索引

  • 編寫高效的SQL語句,比如避免使用SELECT *,盡量使用UNION ALL代替UNION,以及在表關聯時使用INNER JOIN

  • 采用主從復制和讀寫分離提高性能

  • 在數據量大時考慮分庫分表

MySQL的binlog??
  • ?二進制日志,記錄所有數據庫的?寫操作?(DDL/DML
  • ??作用??:主從復制(數據同步), 數據恢復(通過 mysqlbinlog 工具回放日志)
undo log 和 redo log 的區別是什么?
  • redo log 記錄的是數據頁的物理變化,用于服務宕機后的恢復,保證事務的持久性
  • undo log 記錄的是邏輯日志,用于事務回滾時恢復原始數據,保證事務的原子性和一致性
?為什么使用B+ 樹作為索引??而不用哈希表或二叉樹?

B+ 樹 優勢?:

  • B + 樹 的高度低, 磁盤 IO 次數少

  • ??查詢高效??, 葉子節點形成有序鏈表,能夠快速遍歷

  • ??查詢效率穩定?, 所有查詢路徑長度相同,時間復雜度穩定為 O(log n)

?對比其他結構?:

  • 哈希表?不支持范圍查詢,哈希沖突影響性能

  • 二叉樹?:樹高較高,I/O次數多,可能退化為鏈表

??日志與恢復??
??日志????作用????應用場景??
??Redo Log??記錄事務對數據頁的物理修改,保證持久性。崩潰恢復時重放未刷盤的修改。
??Undo Log??記錄事務前的數據邏輯狀態,用于回滾和MVCC。事務回滾、多版本讀。
??BinLog?記錄所有數據庫寫操作(邏輯日志),用于主從復制和數據恢復。數據同步(如MySQL主從)、數據恢復。
事務中的隔離性是如何保證的呢?(解釋下MVCC)

事務的隔離性通過鎖和多版本并發控制(MVCC)來保證。MVCC 通過維護數據的多個版本來避免讀寫沖突。底層實現包括隱藏字段、undo logread view。隱藏字段包括trx_idroll_pointerundo log記錄了不同版本的數據,通過roll_pointer形成版本鏈。read view定義了不同隔離級別下的快照讀,決定了事務訪問哪個版本的數據。

MySQL主從同步原理是什么?

MySQL主從復制的核心是二進制日志(Binlog)。步驟如下:

  1. 主庫在事務提交時記錄數據變更到Binlog

  2. 從庫讀取主庫的Binlog并寫入中繼日志(Relay Log)

  3. 從庫重做中繼日志中的事件,反映到自己的數據中

?

? 執行一條SQL的流程??
  1. ??連接器??:驗證用戶權限,建立連接
  2. ??查詢緩存??:檢查緩存(MySQL 8.0已移除)
  3. ??解析器??:語法分析,生成抽象語法樹(AST)
  4. ??優化器??:選擇最優執行計劃(如索引選擇、JOIN順序)
  5. ??執行器??:調用存儲引擎接口執行計劃
  6. ??存儲引擎??(如InnoDB):
    • 從內存(Buffer Pool)或磁盤讀取數據
    • 寫入Redo Log和Undo Log
  7. ??返回結果??:將結果返回客戶端
如何在MySQL中查看慢查詢?
  • 開啟慢查詢日志

  • 使用 SHOW PROCESSLIST 實時監控?

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

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

相關文章

QT RCC 文件

RCC (Qt Resource Compiler) 是 Qt 框架中的一個工具,用于將資源文件(如圖像、音頻、翻譯文件等)編譯成二進制格式,并嵌入到應用程序可執行文件中。RCC 文件基本概念作用:將應用程序所需的資源文件編譯成 C 代碼&#…

數據湖典型架構解析:2025 年湖倉一體化解決方案

數據湖架構概述:從傳統模型到 2025 年新范式數據湖作為存儲海量異構數據的中央倉庫,其架構設計直接影響企業數據價值的釋放效率。傳統數據湖架構主要關注數據的存儲和管理,而 2025 年的數據湖架構已經演變為更加智能化、自動化的綜合性數據平…

繪圖庫 Matplotlib Search

關于Pathon的繪圖庫的認識和基本操作的學習 這里學習了兩款常用便捷的繪圖庫去學習使用Matplotlib介紹是最受歡迎的一種數據可視化包 是常用的2D繪圖庫 一般常于Numpy和Pandas使用 是數據分析中非常重要的工具可以自定義XY軸 繪制線形圖 柱狀圖 直方圖 密度圖 散點圖 更清晰的展…

Docker詳解及實戰

🎉 Docker 簡介和安裝 - Docker 快速入門 Docker 簡介 Docker是一個開源的平臺,用于開發、交付和運行應用程序。它能夠在Windows,macOS,Linux計算機上運行,并將某一應用程序及其依賴項打包至一個容器中,這…

嵌入式學習的第三十三天-進程間通信-UDP

一、網絡1.定義不同主機間進程通信主機間在硬件層面互聯互通主機在軟件層面互聯互通2.國際網絡體系結構OSI模型(7層): open system interconnect -------理論模型------定義了網絡通信中不同層的協議1977 國際標準化組織各種不同體系結構的計算機能在世…

4、Spring AI_DeepSeek模型_結構化輸出

一、前言 Spring AI 提供跨 AI 供應商(如 OpenAI、Hugging Face 等)的一致性 API, 通過分裝的ChatModel或ChatClient即可輕松調動LLM進行流式或非流式對話。 本專欄主要圍繞著通過OpenAI兼容接口調用各種大語言模型展開學習(因為大部分模型…

Spring Data Redis 從入門到精通:原理與實戰指南

一、Redis 基礎概念 Redis(Remote Dictionary Server)是開源的內存鍵值對數據庫,以高性能著稱。它支持多種數據結構(String、Hash、List、Set、ZSet),并提供持久化機制(RDB、AOF)。 …

免費版酒店押金原路退回系統——仙盟創夢IDE

項目介紹?東方仙盟開源酒店押金管理系統是一款面向中小型酒店、民宿、客棧的輕量級前臺管理工具,專注于簡化房態管理、訂單處理和押金跟蹤流程。作為完全開源的解決方案,它無需依賴任何第三方服務,所有數據存儲在本地瀏覽器中,確…

10. isaacsim4.2教程-RTX Lidar 傳感器

1. 前言RTX Lidar 傳感器Isaac Sim的RTX或光線追蹤Lidar支持通過JSON配置文件設置固態和旋轉Lidar配置。每個RTX傳感器必須附加到自己的視口或渲染產品,以確保正確模擬。重要提示: 在運行RTX Lidar仿真時,如果你在Isaac Sim UI中停靠窗口&…

QT6 源,七章對話框與多窗體(14)棧式窗體 QStackedWidget:本類里代碼很少。舉例,以及源代碼帶注釋。

(1)這不是本章節要用到的窗體組件,只是跟著標簽窗體 QTabWidget 一起學了。這也是 QT 的 UI 界面里的最后幾個容器了。而且本類也很簡單。就了解一下它。 本類的繼承關系如下 : UI 設計界面 :運行效果 :&…

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包

魔百和M401H_國科GK6323V100C_安卓9_不分地區免拆卡刷固件包刷機說明:1,進機頂盒設置(密碼10086),在其他里,一直按左鍵約32下,打開調試模式2,進網絡設置,查看IP地址。3&a…

MySQL基礎02

一. 函數在 MySQL 中,函數是用于對數據進行特定處理或計算的工具,根據作用范圍和返回結果的不同,主要分為單行函數和聚合函數(又稱分組函數)。以下是詳細介紹:1.單行函數單行函數對每一行數據單獨處理&…

LabVIEW 視覺檢測SIM卡槽

針對SIM 卡槽生產中人工檢測效率低、漏檢誤檢率高的問題,設計了基于 LabVIEW 機器視覺的缺陷檢測系統。該系統通過光學采集與圖像處理算法,實現對卡槽引腳折彎、變形、漏銅等缺陷的自動檢測,誤報率為 0,平均檢測時間小于 750ms&am…

RocketMQ5.3.1的安裝

1、下載安裝 RocketMQ 的安裝包分為兩種,二進制包和源碼包。1 下載 Apache RocketMQ 5.3.1的源碼包后上傳到linux https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-source-release.zip2 解壓編譯 $ unzip rocketmq-all-5.3.1-source…

FunASR實時多人對話語音識別、分析、端點檢測

核心功能:FunASR是一個基礎語音識別工具包,提供多種功能,包括語音識別(ASR)、語音端點檢測(VAD)、標點恢復、語言模型、說話人驗證、說話人分離和多人對話語音識別等。FunASR提供了便捷的腳本和…

opencv--day01--opencv基礎知識及基礎操作

文章目錄前言一、opencv基礎知識1.opencv相關概念1.1背景1.2特點1.3主要功能與應用1.4.opencv-python2.計算機中的圖像概念2.1圖像表示2.2圖像存儲彩色圖像二、opencv基礎操作1.圖像的讀取2.圖像的顯示3.保存圖像4.創建黑白圖及隨機像素彩圖5. 圖像切片(圖片剪裁&am…

如何撤銷Git提交誤操作

要撤銷在主分支上的 git add . 和 git commit 操作,可以按照以下步驟安全回退: 完整回退步驟: # 1. 查看提交歷史,確認要回退的commit git log --oneline# 示例輸出: # d3f4g7h (HEAD -> main) 誤操作提交 # a1b2c3…

React+Three.js實現3D場景壓力/溫度/密度分布可視化

本文介紹了一個基于React和Three.js的3D壓力可視化解決方案,該方案能夠: 加載并渲染3D壓力模型數據 提供動態顏色映射功能,支持多種顏色方案:彩虹-rainbow,冷暖-cooltowarm,黑體-blackbody,灰度-grayscale 實現固定位置的顏色圖…

Go 官方 Elasticsearch 客戶端 v9 快速上手與進階實踐*

1、為什么選擇 go-elasticsearch? 版本同步:與 Elasticsearch 主版本保持一一映射,當前穩定分支為 v9,對應 ES 9.x 系列。(GitHub)完全覆蓋 REST API:所有 HTTP 端點都有等價方法,避免手寫 JSON/HTTP。可插…

`/etc/samba/smb.conf`筆記250720

/etc/samba/smb.conf筆記250720 /etc/samba/smb.conf 是 Samba 服務的核心配置文件,用于實現 Linux/Unix 與 Windows 系統間的文件和打印機共享。以下詳解其結構和常用參數: 配置文件結構 1. 全局設置段 [global] 控制 Samba 服務器的整體行為。 …