MySQL 數據操縱與數據庫優化

MySQL數據庫的DML

一、創建(Create)

1. 基本語法

INSERT INTO 表名 [(列名1, 列名2, ...)] 
VALUES (值1, 值2, ...);
  • 省略列名條件:當值的順序與表結構完全一致時,可省略列名(需包含所有字段值)
  • 批量插入:單條語句插入多行數據提升效率
    INSERT INTO student (id, name, score) VALUES
    (1, '張三', 99), (2, '李四', 88), (3, '王五', 77);

2. 高級技巧

  • 自增主鍵處理:使用AUTO_INCREMENT時,無需顯式插入主鍵值
  • 大數據量優化:調整max_allowed_packet參數避免數據包過大錯誤
    SET GLOBAL max_allowed_packet = 1024*1024*100; -- 擴容至100MB[1][8]
  • 核心功能max_allowed_packet?定義了 MySQL 服務器和客戶端之間傳輸的數據包最大允許大小。當執行大容量插入、更新或查詢時,若數據包超過該限制,會觸發?PacketTooBigException?錯誤。
  • 適用場景:處理大型 BLOB 字段、批量導入數據、數據遷移等需要傳輸大容量數據的操作。
  • 臨時生效:通過?SET GLOBAL?修改的參數僅在當前 MySQL 服務運行期間生效,重啟服務后會恢復為配置文件中的默認值。若需永久生效,需修改配置文件(如?my.cnf?或?my.ini)并重啟服務。
  • 單位限制
    • 在命令行中設置時,只能使用字節數(如?1024*1024*100),不可直接使用?M?或?G?單位。
    • 在配置文件中則支持?M/G?單位(如?max_allowed_packet=100M)。
  • 取值范圍:最小值為?1KB,最大值為?1GB(超過會自動調整為?1GB)。

二、讀取(Retrieve)

1. 基礎查詢

  • 全列查詢SELECT * FROM 表名(需警惕性能問題,建議指定必要字段)
  • 別名設置:增強結果可讀性
    SELECT name AS 學生姓名, age+5 AS 修正年齡 FROM student;

2. 聚合函數與分組

  • 核心聚合函數
    SELECT COUNT(*) AS 總人數, AVG(score) AS 平均分,MAX(score) AS 最高分 
    FROM exam_result;
    • COUNT統計行數時推薦使用COUNT(*),避免NULL值干擾
  • 分組查詢
    SELECT course_id, AVG(grade) 
    FROM study 
    GROUP BY course_id 
    HAVING AVG(grade) > 80; -- HAVING對分組后數據篩選[4][5]
    與WHERE區別:WHERE在分組前過濾,HAVING在分組后過濾

3. 子查詢

  • WHERE子句嵌套
    SELECT name 
    FROM student 
    WHERE id IN (SELECT student_id FROM study WHERE course_id = 'CS101'
    );
  • FROM子句派生表
    SELECT t.dept_name, avg_salary 
    FROM (SELECT dept_id, AVG(salary) AS avg_salary FROM emp GROUP BY dept_id
    ) t;

4. 多表連接

  • 內連接:僅返回匹配記錄
    SELECT s.name, sc.score 
    FROM student s 
    INNER JOIN study sc ON s.id = sc.student_id;
  • 左外連接:保留左表所有記錄
    SELECT s.name, sc.score 
    FROM student s 
    LEFT JOIN study sc ON s.id = sc.student_id;

三、更新(Update)

1. 基礎語法

UPDATE 表名 
SET 列名1=值1, 列名2=值2 
WHERE 條件; -- 必須指定條件避免全表更新[8][9]

示例UPDATE emp SET salary=salary*1.1 WHERE dept='研發部';

2. 級聯更新

UPDATE study 
SET grade=grade+5 
WHERE course_id IN (SELECT id FROM course WHERE teacher='張教授'
);

四、刪除(Delete)

1. 條件刪除

DELETE FROM 表名 WHERE 條件; -- 未加條件將清空全表[8]

示例DELETE FROM log WHERE create_time < '2023-01-01';

2. 高效清空(巧用DDL)

TRUNCATE TABLE student; -- 重置自增主鍵,性能優于DELETE[1][8]

限制:外鍵約束存在時不可用,需先解除約束

五、約束與完整性

1. 主鍵與外鍵

CREATE TABLE student_course (student_id INT REFERENCES student(id) ON DELETE CASCADE,course_id INT REFERENCES course(id),PRIMARY KEY(student_id, course_id) -- 復合主鍵[1][5]
);
  • 級聯操作ON DELETE CASCADE實現主表刪除時自動清理關聯數據

2. 唯一性與默認值

CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,email VARCHAR(255) UNIQUE, -- 唯一約束status TINYINT DEFAULT 1 -- 默認值約束[8][9]
);

小結

MySQL CRUD操作是數據庫開發的基礎,掌握其正確使用規則可以提高開發效率和數據安全性。在實際應用中,需要注意以下幾點:

  1. 避免頻繁使用SELECT *,盡量指定需要的列。
  2. 更新和刪除操作時,務必添加WHERE條件,防止誤操作。
  3. 使用TRUNCATE時,確保表中沒有外鍵約束。
  4. 合理設計表結構和約束,提高數據的完整性和一致性。

MySQL數據庫優化

一、查詢優化:從 SQL 到索引的全面調優

  1. EXPLAIN 分析查詢(查執行計劃)

    EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
    • 關鍵字段解讀
      • typeALL(全表掃描,需優化)→ 目標優化到?ref?或?range
      • key:顯示實際使用的索引,若為?NULL?表示未用索引
      • rows:預估掃描行數,數值越大性能越差
      • Extra:出現?Using filesort(額外排序)或?Using temporary(臨時表)需警惕
  2. 避免全表掃描的 3 大技巧

    • 索引覆蓋:確保 WHERE、JOIN、ORDER BY 涉及的列都有索引
    • 函數陷阱:禁止在索引列用函數(如?YEAR(created_at)),改用范圍查詢
      -- 錯誤:索引失效
      SELECT * FROM users WHERE YEAR(created_at) = 2023;
      -- 正確:索引生效
      SELECT * FROM users WHERE created_at BETWEEN '2023-01-01' AND '2023-12-31';
    • 模糊查詢優化:避免?LIKE '%abc%',改用?LIKE 'abc%'(前綴匹配可用索引)
  3. 索引優化的黃金法則

    • 覆蓋索引:查詢字段全在索引中,無需回表
      CREATE INDEX idx_email_name ON users(email, name);  -- 聯合索引
      SELECT email, name FROM users WHERE email = 'user@example.com';  -- 直接命中索引
    • 前綴索引:對長文本(如地址)截取前 20 字符建索引,節省空間?
      CREATE INDEX idx_title_prefix ON articles(title(20));
    • 索引避坑
      • 刪除未使用的索引(如單字段索引被聯合索引覆蓋)
      • 聯合索引順序遵循最左前綴原則(a,b,c)?索引對?aa,b?生效,對?b,c?無效)
  4. JOIN 與分頁的高效寫法

    • JOIN 優化
      • 用小表驅動大表(如?FROM 小表 JOIN 大表
      • 確保關聯字段有索引,避免笛卡爾積
    • 分頁優化(百萬級數據場景):
      -- 傳統分頁(慢):需掃描前 100000 行
      SELECT * FROM users LIMIT 100000, 10;
      -- 優化方案:通過覆蓋索引跳過偏移量
      SELECT * FROM users 
      WHERE id >= (SELECT id FROM users ORDER BY id LIMIT 100000, 1)
      ORDER BY id LIMIT 10;

二、表結構優化:從設計到存儲的進階

  1. 數據類型選擇

    • 數值型優先:用?INT?存 IP(INET_ATON()?轉換),而非?VARCHAR
    • 避免 NULL:用默認值(如空字符串)替代,減少索引復雜度
    • ENUM 妙用:有限值字段(如性別)用 ENUM 比 VARCHAR 更省空間
  2. 范式與反范式的平衡

    • 范式化(減少冗余):適合寫多讀少場景(如日志表)
    • 反范式化(適當冗余):讀多寫少場景(如用戶表冗余常用字段)
  3. 分區與分庫分表

    • 分區表:按時間切分歷史數據,加速查詢
      CREATE TABLE logs (id INT, log_date DATE)
      PARTITION BY RANGE (YEAR(log_date)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2023 VALUES LESS THAN (2024)
      );
    • 分庫分表:單表超千萬行時用 ShardingSphere 分片

三、服務器參數調優:關鍵配置詳解

  1. InnoDB 核心參數

    innodb_buffer_pool_size = 16G  # 物理內存的 70%-80%
    innodb_file_per_table = ON  # 每個表獨立表空間
  2. 查詢緩存慎用

    • 適用場景:讀多寫極少(如靜態配置表)
    • 禁用場景:高并發寫入時,緩存頻繁失效反降低性能
      query_cache_type = 0  # 高寫入場景關閉
  3. 連接與內存管理

    max_connections = 500  # 根據業務負載調整
    wait_timeout = 600  # 空閑連接 10 分鐘斷開
    tmp_table_size = 64M  # 增大臨時表內存

四、架構優化:高可用與擴展方案

  1. 讀寫分離
    • 主庫處理寫操作,從庫處理讀請求(用 ProxySQL 路由)
  2. 高可用方案
    • MHA:自動故障轉移,主庫宕機 30 秒內切換
    • Galera Cluster:多主同步,適合寫負載均衡場景
  3. 緩存與負載均衡
    • Redis 緩存熱點數據:減少數據庫壓力
    • HAProxy:均衡讀請求到多個從庫

五、鎖與事務優化:并發控制秘訣

  1. 隔離級別選擇

    • 默認?REPEATABLE READ?適合多數場景
    • 高并發讀寫可用?READ COMMITTED?減少鎖競爭
  2. 死鎖監控與處理

    innodb_print_all_deadlocks = 1  # 記錄死鎖日志
    • 重試機制:代碼層捕獲死鎖異常后自動重試

六、監控與工具:數據庫的“健康管家”

  1. 內置工具

    • 慢查詢日志:定位耗時 SQL?
      slow_query_log = 1
      long_query_time = 2  # 記錄超過 2 秒的查詢
    • SHOW PROCESSLIST:實時查看活躍連接
  2. 第三方利器

    • Percona Toolkit:分析索引效率與表結構
    • Prometheus + Grafana:可視化監控 QPS、連接數等

七、硬件與系統優化:底層性能基石

  1. 磁盤與文件系統

    • SSD 替代 HDD:隨機讀寫性能提升 10 倍+
    • XFS 文件系統:禁用?atime?減少磁盤寫入
      mount -o noatime,nodiratime /dev/sdb1 /data
  2. 內核參數調優

    • TCP 緩沖區:增大網絡吞吐量
    • 文件句柄數:避免?Too many open files?錯誤

八、持續維護:數據庫的“養生之道”

  1. 定期維護
    • 每月優化碎片化表:OPTIMIZE TABLE large_table;
    • 清理歷史數據:分區表直接?DROP PARTITION
  2. 避免過度優化
    • 二八原則:優先優化 20% 高頻查詢
    • 業務優先:架構擴展前評估投資回報率(如分庫分表成本高)

優化順序指南

  1. 緊急處理:慢查詢優化(見效最快)
  2. 結構調優:索引、表設計、分區
  3. 參數調優:InnoDB 配置、連接數
  4. 架構擴展:讀寫分離、緩存層
  5. 硬件升級:SSD、內存擴容

總結

MySQL 優化是持續過程,需結合業務場景選擇策略。建議從 EXPLAIN 分析和索引優化入手,逐步深入架構設計。記住:“沒有銀彈,只有最適合的方案!”

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

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

    相關文章

    (9)被宏 QT_DEPRECATED_VERSION_X_6_0(“提示內容“) 修飾的函數,在 Qt6 中使用時,會被編譯器提示該函數已過時

    &#xff08;1&#xff09;起因是看到 Qt 的官方源代碼里有這樣的寫法&#xff1a; #if QT_DEPRECATED_SINCE(6, 0) //里面的都是廢棄的成員函數QT_WARNING_PUSHQT_WARNING_DISABLE_DEPRECATEDQT_DEPRECATED_VERSION_X_6_0("Use the constructor taking a QMetaType inst…

    【bibtex4word】在Word中高效轉換bib參考文獻,Texlive環境安裝bibtex4word插件

    前言 現已退出科研界&#xff0c;本人水貨一個。希望幫到有緣人 本篇關于如何將latex環境中的參考文獻bib文件轉化為word&#xff0c;和一些踩坑記錄。 可以看下面的資料進行配置&#xff0c;后面的文字是這些資料的補充說明。 參考文章&#xff1a;https://blog.csdn.net/g…

    Python 自動化腳本開發秘籍:從入門到實戰進階(6/10)

    摘要&#xff1a;本文詳細介紹了 Python 自動化腳本開發的全流程&#xff0c;從基礎的環境搭建到復雜的實戰場景應用&#xff0c;再到進階的代碼優化與性能提升。涵蓋數據處理、文件操作、網絡交互、Web 測試等核心內容&#xff0c;結合實戰案例&#xff0c;助力讀者從入門到進…

    理解反向Shell:隱藏在合法流量中的威脅

    引言 在網絡安全領域&#xff0c;??反向Shell&#xff08;Reverse Shell&#xff09;?? 是一種隱蔽且危險的攻擊技術&#xff0c;常被滲透測試人員和攻擊者用于繞過防火墻限制&#xff0c;獲取對目標設備的遠程控制權限。與傳統的“正向Shell”&#xff08;攻擊者主動連接…

    無人機電池儲存與操作指南

    一、正確儲存方式 1. 儲存電量 保持電池在 40%-60% 電量&#xff08;單片電壓約3.8V-3.85V&#xff09;存放&#xff0c;避免滿電或空電長期儲存。 滿電存放會加速電解液分解&#xff0c;導致鼓包&#xff1b;**空電**存放可能引發過放&#xff08;電壓低于3.0V/片會永久…

    怎樣選擇成長股 讀書筆記(一)

    文章目錄 第一章 成長型投資的困惑一、市場不可預測性的本質困惑二、成長股的篩選悖論三、管理層評估的認知盲區四、長期持有與估值波動的博弈五、實踐中的認知升級路徑總結&#xff1a;破解困惑的行動框架 第二章 如何閱讀應計制利潤表一、應計制利潤表的本質與核心原則1. 權責…

    深入淺出之STL源碼分析6_模版編譯問題

    1.模版編譯原理 當我們在代碼中使用了一個模板&#xff0c;觸發了一個實例化過程時&#xff0c;編譯器就會用模板的實參&#xff08;Arguments&#xff09;去替換&#xff08;Substitute&#xff09;模板的形參&#xff08;Parameters&#xff09;&#xff0c;生成對應的代碼。…

    無人甘蔗小車履帶式底盤行走系統的研究

    1.1 研究背景與意義 1.1.1 研究背景 甘蔗作為全球最重要的糖料作物之一&#xff0c;在農業經濟領域占據著舉足輕重的地位。我國是甘蔗的主要種植國家&#xff0c;尤其是廣西、廣東、云南等地&#xff0c;甘蔗種植面積廣泛&#xff0c;是當地農業經濟的重要支柱產業。甘蔗不僅…

    LVGL(lv_slider滑動條)

    文章目錄 一、lv_slider 是什么&#xff1f;二、創建一個滑塊設置滑塊的范圍和初始值 三、響應滑塊事件四、設置樣式示例&#xff1a;更改滑塊顏色和滑塊按鈕樣式 五、縱向滑塊&#xff08;垂直方向&#xff09;六、雙滑塊模式&#xff08;范圍選擇&#xff09;七、獲取滑塊的值…

    每日算法-250511

    每日算法 - 250511 記錄一下今天刷的幾道LeetCode題目&#xff0c;主要是關于貪心算法和數組處理。 1221. 分割平衡字符串 題目 思路 貪心 解題過程 我們可以遍歷一次字符串&#xff0c;維護一個計數器 balance。當遇到字符 L 時&#xff0c;balance 增加&#xff1b;當遇…

    Keepalived + LVS + Nginx 實現高可用 + 負載均衡

    目錄 Keepalived Keepalived 是什么&#xff08;高可用&#xff09; 安裝 Keepalived LVS LVS 是什么&#xff08;負載均衡&#xff09; 安裝 LVS Keepalived LVS Nginx 實現 高可用 負載均衡 Keepalived Keepalived 是什么&#xff08;高可用&#xff09; Keepaliv…

    【雜談】-DeepSeek-GRM:讓AI更高效、更普及的先進技術

    DeepSeek-GRM&#xff1a;讓AI更高效、更普及的先進技術 文章目錄 DeepSeek-GRM&#xff1a;讓AI更高效、更普及的先進技術1、DeepSeek-GRM&#xff1a;先進的AI框架解析2、DeepSeek-GRM&#xff1a;AI開發的變革之力3、DeepSeek-GRM&#xff1a;廣泛的應用前景4、企業自動化解…

    【MySQL】頁結構詳解:頁的大小、分類、頭尾信息、數據行、查詢、記錄及數據頁的完整結構

    &#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

    【FreeRTOS】基于G431+Cubemx自用筆記

    系列文章目錄 留空 文章目錄 系列文章目錄前言一、從頭開始創建一個FreeRTOS工程1.1 在 "Timebase Source" 中&#xff0c;選擇其他TIM1.2 配置FreeRTOS的參數1. 3 添加任務 二、動態任務的創建/刪除2.1 函數介紹2.1.1 創建動態任務xTaskCreate()2.1.2 創建靜態任務…

    LVGL(lv_bar進度條)

    文章目錄 一、lv_bar 是什么&#xff1f;二、基本使用創建一個進度條設置進度值 三、條形方向與填充方向四、范圍模式&#xff08;Range&#xff09;五、事件處理&#xff08;可選&#xff09;六、自定義樣式&#xff08;可選&#xff09;七、綜合示例八、配合 lv_timer 或外部…

    AI對話小技巧

    角色設定&#xff1a;擅于使用 System 給 GPT 設定角色和任務&#xff0c;如“哲學大師"指令注入&#xff1a;在 System 中注入常駐任務指令&#xff0c;如“主題創作"問題拆解&#xff1a;將復雜問題拆解成的子問題&#xff0c;分步驟執行&#xff0c;如&#xff1a…

    C++ 核心基礎:數字、數組、字符串、指針與引用詳解

    C++ 核心基礎:數字、數組、字符串、指針與引用詳解 1. C++ 基礎語法1.1 標識符與保留字1.2 數據類型概述1.3 基本輸入輸出2.1 基本整數類型(int、short、long、long long)2.2 無符號整數類型(unsigned int、unsigned short、unsigned long、unsigned long long)2.3 整數類…

    HarmonyOS運動開發:如何集成百度地圖SDK、運動跟隨與運動公里數記錄

    前言 在開發運動類應用時&#xff0c;集成地圖功能以及實時記錄運動軌跡和公里數是核心需求之一。本文將詳細介紹如何在 HarmonyOS 應用中集成百度地圖 SDK&#xff0c;實現運動跟隨以及運動公里數的記錄。 一、集成百度地圖 SDK 1.引入依賴 首先&#xff0c;需要在項目的文…

    如何理解k8s中的controller

    一、基本概念 在k8s中&#xff0c;Controller&#xff08;控制器&#xff09;是核心組件之一&#xff0c;其負責維護集群狀態并確保集群內的實際狀態與期望狀態一致的一類組件。控制器通過觀察集群的當前狀態并將其與用戶定義的期望狀態進行對比&#xff0c;做出相應的調整來實…

    《Go小技巧易錯點100例》第三十二篇

    本期分享&#xff1a; 1.sync.Map的原理和使用方式 2.實現有序的Map sync.Map的原理和使用方式 sync.Map的底層結構是通過讀寫分離和無鎖讀設計實現高并發安全&#xff1a; 1&#xff09;雙存儲結構&#xff1a; 包含原子化的 read&#xff08;只讀緩存&#xff0c;無鎖快…