MySQL常見問題概述

一、MySQL常見問題概述

MySQL是最常用的關系型數據庫,但使用中常會遇到 性能慢、數據丟失、主從不同步、鎖沖突 等問題。這些問題可能導致系統響應變慢、用戶操作失敗,甚至數據損壞。
核心解決思路:先定位問題類型(是查詢慢?還是鎖沖突?),再針對性優化(加索引、調整事務、修復主從等)。

二、常見問題類型及解決方法

類型1:查詢慢(性能問題)

概述:執行一條SQL時,響應時間很長(比如查訂單表要10秒),導致用戶界面卡頓。
常見原因

  • 沒有索引或索引失效;
  • SQL寫法差(比如全表掃描、嵌套子查詢);
  • 數據量太大(單表超1000萬條)。

**索引的作用 **

  1. 提升查詢速度:索引就像書籍的目錄,能讓數據庫系統快速找到所需數據,減少 I/O 操作。
  2. 確保數據唯一性:唯一索引可以防止表中出現重復值,保證數據的唯一性。
  3. 優化數據排序:索引中的數據是按照一定順序存儲的,這有助于加快 ORDER BY 和 GROUP BY 操作的速度。
  4. 用作連接條件:在進行表連接操作時,索引能有效提高連接的效率。

索引的重復性規則

  1. 普通索引:允許索引列中有重復值,也允許有空值(NULL)。
  2. 唯一索引:索引列中的值必須是唯一的,但可以存在多個 NULL 值。
  3. 主鍵索引:這是一種特殊的唯一索引,要求索引列的值不能重復,也不能為 NULL。
  4. 復合索引:由多個列組合而成的索引,列的組合必須是唯一的,但單個列的值可以重復。

使用場景:電商系統查詢“近1年的訂單”、社交APP查“用戶聊天記錄”。

解決方法 & 代碼實現

1.EXPLAIN分析執行計劃:查看SQL是否走了索引。

EXPLAIN SELECT * FROM orders WHERE user_id = 123;  -- 執行后看"type"字段,理想情況是"ref"或"eq_ref",如果是"ALL"說明全表掃描(沒索引)

2.添加合適的索引:給查詢條件字段加索引(比如user_id)。

CREATE INDEX idx_orders_user ON orders(user_id);  -- 給orders表的user_id加索引

3.優化SQL寫法:避免在索引列上做計算、類型轉換或使用SELECT *(只查需要的字段)。

-- 差寫法(索引失效):對user_id做了計算
SELECT * FROM orders WHERE user_id + 1 = 124;
-- 好寫法(直接用字段)
SELECT * FROM orders WHERE user_id = 123;
類型2:鎖沖突(并發問題)

概述:多個用戶同時修改同一條數據,導致“鎖等待”或“死鎖”,比如兩個用戶同時搶單,系統提示“操作失敗”。

MySQL的鎖按 作用范圍 分為3類:全局鎖、表級鎖、行級鎖(InnoDB特有)。不同引擎支持的鎖不同(MyISAM只有表鎖,InnoDB支持表鎖+行鎖)。

  • 全局鎖(給整個數據庫“上大鎖”)

鎖定整個MySQL實例,所有數據庫的讀寫操作都會被阻塞(除了“讀鎖”允許讀,但寫被禁止)。

  • 表級鎖
    • 表讀鎖(READ鎖):允許其他事務讀表,但不能寫(類似“書架被鎖,只能看不能拿書”)。

    • 表寫鎖(WRITE鎖):只有當前事務能讀寫,其他事務讀寫都被阻塞(類似“書架被鎖,只有你能拿書”)。

      使用場景

      • MyISAM引擎(不支持行鎖)的寫操作(如批量刪除、修改全表數據);
      • 高并發下需要快速鎖定整張表(比如清空日志表)。
      -- 手動加表鎖(MyISAM或InnoDB都支持,但InnoDB推薦用行鎖):
      LOCK TABLES goods READ;  -- 加讀鎖(只能讀,不能寫)
      LOCK TABLES goods WRITE;  -- 加寫鎖(只能當前事務讀寫)-- 解鎖:
      UNLOCK TABLES;
      
  • 行級鎖(給“具體一本書”上鎖)

    • 共享鎖(S鎖):允許其他事務讀該行,但不能寫(類似“你和朋友都能看同一本書,但不能拿走”)。
    • 排他鎖(X鎖):禁止其他事務讀寫該行(類似“你拿走了書,別人不能看也不能拿”)。
    • 意向鎖(IS/IX鎖):協調表鎖和行鎖的共存(比如加行鎖前先加意向鎖,告訴表鎖“我要鎖行”)。
    • 間隙鎖(Gap Lock):鎖定索引之間的“間隙”,防止幻讀(比如鎖定id=10到id=20之間的間隙,禁止插入新行)。
    • 臨鍵鎖(Next-Key Lock):行鎖+間隙鎖的組合,InnoDB默認的鎖模式(防止幻讀和行鎖沖突)。

常見類型

  • 行鎖:InnoDB引擎默認鎖一行(比如修改某條訂單);
  • 表鎖:MyISAM引擎鎖整張表(很少用了);
  • 死鎖:兩個事務互相等待對方的鎖(比如事務A鎖了記錄1,事務B鎖了記錄2,又都想鎖對方的記錄)。

使用場景:秒殺活動(同時搶庫存)、銀行轉賬(同時改賬戶余額)。

解決方法 & 代碼實現

  1. 縮短事務時間:避免在事務中做無關操作(比如先查數據再修改,減少鎖持有時間)。

    -- 差寫法(事務太長,鎖時間久):
    START TRANSACTION;
    SELECT * FROM stock WHERE product_id = 123;  -- 查庫存
    -- 這里可能做其他無關操作(比如發消息),導致鎖一直被占
    UPDATE stock SET num = num -1 WHERE product_id = 123;  -- 修改庫存
    COMMIT;-- 好寫法(事務只包含必要操作):
    START TRANSACTION;
    UPDATE stock SET num = num -1 WHERE product_id = 123;  -- 直接修改,減少鎖時間
    COMMIT;
    
  2. 避免死鎖:讓事務按固定順序訪問數據(比如都先鎖product_id=1再鎖product_id=2)。

  3. 設置鎖超時:通過innodb_lock_wait_timeout設置等待時間(默認50秒),超時自動回滾。

    SET innodb_lock_wait_timeout = 5;  -- 等待5秒沒拿到鎖就報錯,避免長時間阻塞
    

不同鎖的對比 & 選擇建議

鎖類型粒度并發能力適用場景風險
全局鎖整個數據庫最低全庫備份(已逐漸被替代)業務停寫,高并發慎用
表級鎖整張表MyISAM引擎、批量操作容易阻塞,影響并發
行級鎖(X/S)單一行最高InnoDB高并發事務(如扣庫存)鎖沖突(死鎖、等待)
間隙鎖索引間隙中等防止幻讀(范圍查詢)可能阻塞正常插入操作
類型3:主從復制延遲(高可用問題)

概述:主庫(寫數據)和從庫(讀數據)數據不同步,比如主庫剛修改了用戶信息,從庫查不到最新數據。
常見原因

  • 主庫寫操作太多(比如每秒1000次寫入),從庫同步不過來;
  • 從庫硬件性能差(CPU/內存不夠);
  • 網絡延遲(主從跨機房,同步慢)。

使用場景:讀寫分離架構(主庫寫、從庫讀)的系統,比如新聞APP的“用戶評論”寫入主庫,從庫讀取展示。

解決方法 & 代碼實現

  1. 查看復制狀態:用SHOW SLAVE STATUS檢查Seconds_Behind_Master(主從延遲秒數)。
SHOW SLAVE STATUS\G  -- 看"Seconds_Behind_Master"字段,正常是0,大于0表示延遲
  1. 優化主庫SQL:減少大事務、批量操作(比如將1000條插入分成10次100條),降低主庫壓力。
  2. 升級從庫硬件:給從庫加CPU、內存,或用更快的硬盤(比如SSD)。
  3. 開啟并行復制(MySQL 5.7+):從庫用多線程同步,提高速度。
-- 在從庫配置文件(my.cnf)中添加:
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4  -- 4個線程并行復制
類型4:數據丟失(安全問題)

概述:誤刪表、誤操作(比如DROP TABLE),或硬件損壞導致數據丟失。
常見原因

  • 人為誤操作(比如執行了錯誤的SQL);
  • 沒做備份;
  • 硬盤損壞(沒冗余)。

解決方法 & 代碼實現

  1. 定期備份:用mysqldump做邏輯備份(適合小數據),或用物理備份工具(如Percona XtraBackup,適合大數據)。
# 邏輯備份(備份整個數據庫):
mysqldump -u root -p mydb > mydb_backup.sql
  1. 開啟二進制日志(binlog):記錄所有寫操作,用于恢復到誤操作前的時間點。
-- 在my.cnf中添加(重啟MySQL生效):
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW  -- 記錄行級操作,更安全
  1. 數據恢復步驟

    • 用最近的備份恢復數據庫;

    • 用binlog補全備份后到誤操作前的所有操作。

    # 恢復備份:
    mysql -u root -p mydb < mydb_backup.sql
    # 用binlog恢復到誤刪前(比如20xx-01-01 10:00:00):
    mysqlbinlog --stop-datetime="20xx-01-01 10:00:00" /var/log/mysql/mysql-bin.000001 | mysql -u root -p mydb
    

三、總結

MySQL常見問題的核心解決思路是“先定位,再優化”:

  • 查詢慢:用EXPLAIN找索引問題,加索引或優化SQL;
  • 鎖沖突:縮短事務、按順序訪問數據、設置鎖超時;
  • 主從延遲:優化主庫SQL、升級從庫硬件、開啟并行復制;
  • 數據丟失:定期備份+開啟binlog,誤刪后用備份+binlog恢復。

日常預防建議

  • 定期用pt-query-digest分析慢查詢日志;

  • 監控主從延遲(用Seconds_Behind_Master);

  • 重要操作前備份(比如刪除數據前先導出);

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

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

相關文章

zlmediakit windows 編譯webrtc

1、環境準備 系統環境&#xff1a;Windows 10 專業版 序號名稱版本用途1Microsoft Visual Studio20222openssl3.0.53cmake3.24.04libsrtp2.4.0webrtc播放需要 2、安裝libsrtp https://github.com/cisco/libsrtp/releases/tag/v2.4.2 2.1、新建構建目錄 在libsrtp-2.4.2根目錄…

Redis Pipelining 是性能加速的秘密武器?

在高性能的現代應用中&#xff0c;Redis 因其閃電般的速度而備受青睞。而 Pipelining&#xff08;管道技術&#xff09; 則是 Redis 性能優化的核心功能之一。許多開發者都聽說過它能提升性能&#xff0c;但它究竟是如何做到的&#xff1f;是否會帶來負面影響&#xff1f;今天我…

系統性能優化-6 TCP 三次握手

系統性能優化-6 TCP 三次握手 TCP 三次握手 客戶端優化 客戶端發送 SYN 給服務器 此時客戶端連接狀態&#xff1a;SYN_SENT如果服務器繁忙或中間網絡不暢&#xff0c;客戶端會重發 SYN&#xff0c;重試的次數由 tcp_syn_retries 參數控制&#xff0c;默認是 6 次&#xff0c;第…

WPF 實現自定義彈窗輸入功能

1.前端實現 <Grid><Grid.RowDefinitions><RowDefinition Height"60" /><RowDefinition Height"*" /></Grid.RowDefinitions><BorderGrid.Row"0"BorderBrush"WhiteSmoke"BorderThickness"0.1&qu…

WPF中Converter基礎用法

IValueConverter 1.創建一個類集成接口IValueConverter,并實現 2在xaml中引入 舉例 性別用int來表示&#xff0c;1為男&#xff0c;2為女 核心代碼 創建GenderConverter繼承IValueConverter public class GenderConverter : IValueConverter {//model->view轉換public…

Postgresql的json充當字典應用

一般我們會將一些系統參數放到參數表中&#xff0c;有些參數的值是json結構&#xff0c;那么如何在查詢時引用這些參數&#xff1f;&#xff1f; 比如我在業務表的的xxx_type,或xxx_status記錄的是key,又想在查詢的時候顯示其描述。 先定義字典 如下圖如何應用 Postgresql對j…

Dify全面升級:打造極致智能應用開發體驗,攜手奇墨科技共拓AI新生態

智能應用開發平臺Dify以六大核心功能升級與深度性能優化&#xff0c;重新定義AI開發效率與體驗。本次更新不僅響應了開發者社區的迫切需求&#xff0c;更通過與云計算領域先鋒奇墨科技的戰略合作&#xff0c;為企業提供了從開發到部署的全鏈路智能化解決方案。 .技術領先&#…

關于uniapp開發阻止事件冒泡問題

背景。uniapp開發微信小程序。在使用兩個組件拼接嵌套使用后&#xff0c;發現問題&#xff0c;會誤操作跳轉到更多頁面。下圖中兩個事件若不使用stop修飾符&#xff0c;會相互影響。若點擊uni-list-item會串行觸發uni-card的handledoctorlist方法。 產生上面問題原因是組件之間…

箭頭函數和普通函數的區別?

箭頭函數&#xff08;Arrow Functions&#xff09;和普通函數&#xff08;傳統函數&#xff09;在 JavaScript 中有顯著的區別&#xff0c;主要體現在語法、this 的綁定、構造函數行為、參數處理等方面。以下是詳細對比&#xff1a; 1. 語法差異 普通函數&#xff1a; functio…

Linux系統日志與守護進程開發實戰指南

Linux系統日志與守護進程開發實戰指南 系統日志與守護進程 ├── 系統日志syslog │ ├── 日志路徑: /var/log/syslog │ └── 核心API │ ├── openlog │ ├── syslog │ └── closelog └── 守護進程daemon└── 創建步驟├── um…

Vue.js 過濾器詳解

Vue.js 過濾器詳解 下面我將詳細講解Vue.js中過濾器的語法和使用注意事項&#xff0c;并提供一個完整的演示頁面。 過濾器基本概念 在Vue.js中&#xff0c;過濾器&#xff08;Filters&#xff09; 是用于文本格式化的功能&#xff0c;可以在雙花括號插值和v-bind表達式中使用…

【iOS】iOS崩潰總結

【iOS】iOS崩潰總結 一、前言 之前寫了一篇博文《【Flutter】程序報錯導致的灰屏總結》&#xff0c;瀏覽量、收藏率和點贊量還挺高&#xff0c;還被收錄了&#xff0c;就想著總結一下iOS崩潰&#xff0c;這個也是在iOS面試中經常被問到的。 在 iOS 開發過程中&#xff0c;導致…

機器學習:特征向量與數據維數概念

特征向量與數據維數概念 一、特征向量與維數的定義 特征向量與特征類別 在機器學習和數據處理中&#xff0c;每個樣本通常由多個特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一張圖片的特征可能包括顏色、形狀、紋理等&#xff1b;一個客戶的特征可能包括年齡…

開發基于Jeston Orin Nx 開發版 16G的實現

一、基本配置 1.配置參數 密碼&#xff1a;yahboom Ubuntu 20.04版本、python3.8、CUDA11.4、cuDNN8.6、TensorRT8.5、Jetpack5.1.1、Opencv4.5.4版本 終端輸入命令&#xff1a;sudo jtop 其中Jetpack是英偉達提供的專門供它自己的嵌入式計算機平臺使用的人工智能包。 終…

【技術分享】XR技術體系淺析:VR、AR與MR的區別、聯系與應用實踐

XR技術體系淺析&#xff1a;VR、AR與MR的區別、聯系與應用實踐 作者&#xff1a;EQ 雪梨蛋花湯 本文是技術分享文檔&#xff0c;淺析VR&#xff08;虛擬現實&#xff09;、AR&#xff08;增強現實&#xff09;、MR&#xff08;混合現實&#xff09;的定義、特性、技術演進路線&…

R語言入門課| 05 一文掌握R語言常見數據類型

視頻教程 大家可以先做一做R語言基礎小測驗&#xff0c;看看自己是否需要跟我們5.5h入門R語言的課程。 先上教程視頻&#xff0c;B站同步播出&#xff1a; https://www.bilibili.com/video/BV1miNVeWEkw 完整視頻回放和答疑服務可見&#xff1a;5.5h入門R語言 本節課程視頻…

vRDMA 發布,助力云上 VPC 內高性能通信

資料來源&#xff1a;火山引擎-開發者社區 近日&#xff0c;火山引擎基于部分云服務器實例規格邀測發布 vRDMA 特性&#xff0c;提供云上 VPC 內大規模 RDMA 加速能力&#xff0c;可兼容傳統 HPC 應用、AI 應用以及傳統 TCP/IP 應用&#xff0c;降低大眾化場景的適配門檻&#…

Win10安裝dify

一、win10虛擬化設置&#xff0c;控制面板中開啟如下三個服務 二、檢查確認wls服務開啟 設置自動啟動并啟動 確認服務開啟 bcdedit 是否為auto&#xff0c;如果不是&#xff0c;設置為auto bcdedit /set hypervisorlaunchtype autocpu是否為虛擬化 更新wsl wsl --update二 …

【ai學習筆記】GitLab

CI/CD&#xff08;持續集成/持續交付&#xff09;是現代軟件開發中的關鍵實踐&#xff0c;通過自動化工具可以大幅提升開發效率和軟件質量。下面為你介紹CI/CD的核心概念、常用工具以及示例配置&#xff1a; 1. CI/CD 核心概念 持續集成&#xff08;CI&#xff09;&#xff1…

Solidity 從 0 到 1 |Web3 開發入門免費共學營

開啟你的 Web3 開發之旅&#xff0c;從 Sonic 開始&#xff01; 想進入區塊鏈開發的世界&#xff0c;卻不知道從哪里開始&#xff1f;選擇對的語言和平臺&#xff0c;才能事半功倍。 Solidity 是 Web3 中最主流、最通用的智能合約開發語言&#xff0c;被廣泛應用于以太坊及其…