MySQL 高級特性與性能優化:深入理解函數、視圖、存儲過程、觸發器

大家好!今天我們要深入探討 MySQL 中一些非常重要的高級主題——內置函數視圖存儲過程觸發器索引事務鎖機制。無論你是剛開始學習數據庫的新手,還是經驗豐富的開發者,掌握這些知識點都將極大提升你的開發效率和數據管理能力。


一. 內置函數

什么是內置函數?

內置函數 是 MySQL 提供的用于處理各種數據類型和計算需求的預定義函數。它們可以幫助我們簡化復雜的操作,提高代碼的可讀性和執行效率。

核心內容:
  • 聚合函數
  • 數學函數
  • 字符串函數
  • 日期函數
  • 控制流函數
  • 窗口函數

1. 聚合函數

聚合函數用于對一組值進行計算并返回單個值。

-- 統計每個部門的員工數量
SELECT dept_id, COUNT(*) AS 員工數量 FROM employees GROUP BY dept_id;-- 連接每個部門的員工姓名,按部門(dept_id)對員工姓名進行分組拼接
SELECT dept_id, GROUP_CONCAT(name SEPARATOR ',') AS 員工姓名 FROM employees GROUP BY dept_id;

注意:

  • COUNT?統計數量。
  • GROUP_CONCAT?將多個值連接成一個字符串。

2. 數學函數

數學函數用于數值計算。

-- 絕對值
SELECT ABS(-10); -- 10-- 向上取整
SELECT CEIL(3.14); -- 4-- 四舍五入
SELECT ROUND(3.14159, 2); -- 3.14

注意:

  • ABS?返回絕對值。
  • CEIL?向上取整。
  • ROUND?四舍五入,可以指定保留小數位數。

3. 字符串函數

字符串函數用于處理字符串。

-- 連接字符串
SELECT CONCAT('Hello', ' World'); -- 'Hello World'-- 截取子字符串
SELECT SUBSTRING('MySQL', 1, 3); -- 'MyS'-- 替換字符串
SELECT REPLACE('MySQL', 'My', 'Your'); -- 'YourSQL'

注意:

  • CONCAT?連接多個字符串。
  • SUBSTRING?截取子字符串,起始位置從1開始。
  • REPLACE?替換字符串中的部分內容。

4. 日期函數

日期函數用于處理日期和時間。

-- 當前日期時間
SELECT NOW(); -- 例如:2023-11-11 12:34:56-- 日期加法
SELECT DATE_ADD('2023-11-11', INTERVAL 1 DAY); -- 2023-11-12-- 計算日期差
SELECT DATEDIFF('2023-11-11', '2023-10-01'); -- 41

注意:

  • NOW()?返回當前日期和時間。
  • DATE_ADD?和?DATE_SUB?分別用于日期加減。
  • DATEDIFF?計算兩個日期之間的天數差。

5. 窗口函數

窗口函數用于計算基于一組行的聚合值,不會將多行壓縮為一行。

-- 創建示例表
CREATE TABLE sales(id INT PRIMARY KEY COMMENT '員工ID,主鍵',employee VARCHAR(50) COMMENT '員工姓名',department VARCHAR(50) COMMENT '所屬部門,如 Tech、Sales等',salary DECIMAL(10,2) COMMENT '薪資金額,單位:元',sale_date DATE COMMENT '銷售記錄日期'
);-- 插入示例數據
INSERT INTO sales VALUES 
(1, 'Alice', 'Tech', 7000, '2023-01-15'),
(2, 'Bob', 'Tech', 8000, '2023-02-20');-- 行號函數
SELECT employee, department, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM sales;

注意:

  • ROW_NUMBER()?為每行分配唯一的連續序號。
  • RANK()?和?DENSE_RANK()?用于排名,支持并列排名。
  • 可以使用?PARTITION BY?對結果進行分組。

二. 視圖(Views)

什么是視圖?

視圖 是虛擬表,是基于查詢結果的可視化表。它可以幫助我們簡化復雜查詢,限制數據訪問,并提供數據獨立性。

核心內容:
  • 創建視圖
  • 修改視圖
  • 更新視圖
  • 刪除視圖

1. 創建視圖

-- 創建視圖
CREATE VIEW v_employee_dept AS 
SELECT e.id, e.name, d.name AS dept_name, e.salary 
FROM employees e 
INNER JOIN departments d ON e.dept_id = d.id;

2. 修改視圖

-- 修改視圖
CREATE OR REPLACE VIEW v_employee_dept AS 
SELECT e.id, e.name, d.name AS dept_name, e.salary, e.hire_date 
FROM employees e 
INNER JOIN departments d ON e.dept_id = d.id;

3. 更新視圖

-- 更新視圖
UPDATE v_employee_dept SET salary = 10000 WHERE name = '張三';

4. 刪除視圖

-- 刪除視圖
DROP VIEW v_employee_dept;

三. 存儲過程、存儲函數與觸發器

什么是存儲過程和存儲函數?

存儲過程 是一組預編譯的 SQL 語句,保存在數據庫中,可通過名稱調用。存儲函數 是返回值的存儲過程,可以在 SQL 語句中調用。

核心內容:
  • 創建存儲過程
  • 創建存儲函數
  • 觸發器

1. 創建存儲過程

DELIMITER //
CREATE PROCEDURE get_employee_by_dept(IN dept_name VARCHAR(50))
BEGINSELECT e.id, e.name, e.salary FROM employees e INNER JOIN departments d ON e.dept_id = d.id WHERE d.name = dept_name;
END //
DELIMITER ;-- 調用存儲過程
CALL get_employee_by_dept('技術部');

2. 創建存儲函數

-- 設置全局參數
SET GLOBAL log_bin_trust_function_creators = TRUE;DELIMITER //
CREATE FUNCTION get_dept_avg_salary(dept_name VARCHAR(50)) RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGINDECLARE avg_sal DECIMAL(10,2);SELECT AVG(e.salary) INTO avg_sal FROM employees e INNER JOIN departments d ON e.dept_id = d.id WHERE d.name = dept_name;RETURN avg_sal;
END //
DELIMITER ;-- 調用存儲函數
SELECT get_dept_avg_salary('技術部');

3. 觸發器

觸發器是在表上定義的特殊存儲過程,當表發生 INSERTUPDATEDELETE 操作時自動執行。

-- 創建日志表
CREATE TABLE employee_log(id INT PRIMARY KEY AUTO_INCREMENT,operation VARCHAR(20),employee_id INT,operation_time DATETIME
);-- 創建觸發器
DELIMITER //
CREATE TRIGGER after_employee_insert AFTER INSERT ON employees FOR EACH ROW
BEGININSERT INTO employee_log(operation, employee_id, operation_time)VALUES('INSERT', NEW.id, NOW());
END //
DELIMITER ;

四. 索引、存儲引擎、事務與鎖

什么是索引?

索引 是提高查詢性能的重要手段,MySQL 支持多種索引類型,包括普通索引、唯一索引、主鍵索引、組合索引和全文索引。

-- 創建索引
CREATE INDEX idx_employee_name ON employees(name);-- 創建唯一索引
CREATE UNIQUE INDEX idx_employee_email ON employees(email);-- 查看索引
SHOW INDEX FROM employees;

1. 創建索引

-- 創建組合索引
CREATE INDEX idx_dept_salary ON employees(dept_id, salary);

2. 存儲引擎

存儲引擎是 MySQL 用于存儲和管理數據的底層組件,常見的存儲引擎有 InnoDB 和 MyISAM。

-- 創建 MyISAM 引擎的日志表
CREATE TABLE test_myisam(id INT PRIMARY KEY,name VARCHAR(50)
) ENGINE=MyISAM;

3. 事務

事務是一組原子性的 SQL 操作,要么全部執行成功,要么全部執行失敗。事務具有 ACID 特性:原子性、一致性、隔離性和持久性。

-- 開始事務
START TRANSACTION;-- 執行操作
UPDATE employees SET salary = salary + 1000 WHERE dept_id = 1;
INSERT INTO employee_log(operation, employee_id, operation_time) 
VALUES ('SALARY_INCREASE', 1, NOW());-- 提交事務
COMMIT;

4. 鎖機制

鎖是 MySQL 用于并發控制的機制,分為表鎖和行鎖。

-- 表鎖
LOCK TABLES employees WRITE;-- 行鎖
SELECT * FROM employees WHERE id = 1 FOR UPDATE;

五. 性能優化

如何進行性能優化?

性能優化的步驟包括查看 SQL 執行頻率、定位低效率執行 SQL、分析執行計劃、優化索引和優化 SQL 語句。

核心內容:
  • 查看 SQL 執行頻率
  • 定位低效率執行 SQL
  • 分析執行計劃
  • 優化索引
  • 優化 SQL 語句

1. 查看 SQL 執行頻率

-- 查看 SQL 執行頻率
SHOW GLOBAL STATUS LIKE 'Com_%';

2. 定位低效率執行 SQL

-- 查看正在執行的慢查詢
SHOW PROCESSLIST;

3. 分析執行計劃

-- 分析執行計劃
EXPLAIN SELECT * FROM employees WHERE dept_id = 1;

4. 優化索引

避免索引失效,選擇合適的索引列,覆蓋索引等策略。

-- 索引失效示例
SELECT * FROM employees WHERE YEAR(hire_date) = 2020; -- 索引失效-- 優化后
SELECT * FROM employees WHERE hire_date >= '2020-01-01' AND hire_date < '2021-01-01'; -- 索引有效

六. 總結與最佳實踐

總結

功能說明
聚合函數對一組值進行計算并返回單個值
數學函數用于數值計算
字符串函數處理字符串
日期函數處理日期和時間
窗口函數計算基于一組行的聚合值
視圖虛擬表,基于查詢結果
存儲過程預編譯的 SQL 語句
存儲函數返回值的存儲過程
觸發器自動執行的存儲過程
索引提高查詢性能
存儲引擎數據存儲和管理的底層組件
事務原子性的 SQL 操作
鎖機制并發控制

?最佳實踐

  • 合理使用內置函數:根據業務需求選擇合適的函數。
  • 靈活運用視圖:簡化復雜查詢,限制數據訪問。
  • 優化存儲過程和函數:提高代碼的可維護性和執行效率。
  • 合理使用索引:避免索引失效,選擇合適的索引列。
  • 事務和鎖機制:確保數據的一致性和并發控制。

一句話總結:

MySQL 的高級特性和性能優化功能幫助我們構建高效、可靠的數據管理系統,讓我們的應用更加健壯和高效。


結語

通過這篇博客,我們詳細講解了 MySQL 中高級特性和性能優化的核心概念和使用方法。無論你是剛剛開始學習數據庫,還是已經在實際項目中應用,掌握這些知識點都能讓你的數據管理更加得心應手。

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

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

相關文章

Linux學習:基于環形隊列的生產者消費者模型

目錄1. 環形隊列的概念與實現方法1.1 環形隊列的概念1.2 環形隊列的一般實現方法2. 多線程相關的信號量概念與接口2.1 信號量類型2.2 信號量的初始化與銷毀2.3 信號量的P申請、V釋放操作3. 基于環形隊列實現p、c模型的設計方案3.1 環形隊列&#xff08;ringqueue&#xff09;作…

【左程云算法07】隊列和棧-鏈表數組實現

目錄 ?編輯1&#xff09;隊列的介紹 核心操作 3&#xff09;隊列的鏈表實現和數組實現 使用數組實現隊列 2&#xff09;棧的介紹 核心操作 4&#xff09;棧的數組實現 使用語言內置的實現 使用數組手動實現棧 5&#xff09;環形隊列的實現 leecode622 代碼解析 視頻…

Docker 清理完整指南:釋放磁盤空間的最佳實踐

前言 隨著 Docker 使用時間的增長,系統中會積累大量的容器、鏡像、數據卷和構建緩存,占用大量磁盤空間。本文將詳細介紹如何有效清理 Docker 資源,釋放磁盤空間,保持系統整潔。 Docker 資源類型 Docker 主要占用磁盤空間的資源包括: 容器 (Containers):運行中和已停止…

零基礎快速了解掌握Linux防火墻-Iptables

一、 Iptables概述Iptables 是一個用戶空間程序&#xff0c;可以用于設置和管理 Linux 操作系統的內核級防火墻。它通過表、鏈和 規則組成&#xff0c;可以靈活地根據不同的需求進行配置。iptables 具有以下特點&#xff1a;Iptables 作為內核級別的防火墻&#xff0c;具有高效…

12公里無人機圖傳模組:從模糊到超高清的飛躍,抗干擾能力全面升級

在無人機行業飛速發展的今天&#xff0c;高清圖像傳輸已成為衡量無人機性能的重要標志之一。過去&#xff0c;無人機在長距離飛行時常常面臨信號衰減、圖像模糊&#xff0c;甚至數據丟失的問題&#xff0c;影響了用戶的體驗與應用效果。為了打破這一瓶頸&#xff0c;業內專家不…

從 “模板” 到 “場景”,用 C++ 磨透拓撲排序的實戰邏輯

文章目錄前言&#xff1a;《算法磨劍: 用C思考的藝術》 專欄《C&#xff1a;從代碼到機器》 專欄《Linux系統探幽&#xff1a;從入門到內核》 專欄正文&#xff1a;[B3644 【模板】拓撲排序 / 家譜樹](https://www.luogu.com.cn/problem/B3644)【解法】【參考代碼】[P2712 攝像…

盲盒抽卡機小程序:從0到1的蛻變之路

盲盒抽卡機小程序從概念提出到最終上線&#xff0c;經歷了從0到1的蛻變過程。這個過程充滿了挑戰與機遇&#xff0c;也凝聚了開發團隊的智慧和汗水。本文將分享盲盒抽卡機小程序的開發歷程&#xff0c;探討其背后的技術實現和市場策略。需求分析&#xff1a;明確目標用戶與市場…

分層-三層架構

文章目錄介紹代碼拆分Dao層server層controller層運行結果介紹 在我們進行程序設計以及程序開發時&#xff0c;盡可能讓每一個接口、類、方法的職責更單一些&#xff08;單一職責原則&#xff09;。 單一職責原則&#xff1a;一個類或一個方法&#xff0c;就只做一件事情&#…

Vue2 VS Vue3

vue3 是的&#xff0c;Vue 3 確實取消了基于 JavaScript 原型的 Vue 和 VueComponent 構造函數&#xff08;即你提到的 vm 和 vc&#xff09;&#xff0c;取而代之的是一種完全不同的、基于普通對象和代理&#xff08;Proxy&#xff09;的實例管理方式。 這是一個顛覆性的改變…

Vue3入門到實戰,最新版vue3+TypeScript前端開發教程,Vue3簡介,筆記02

筆記02 一、Vue3簡介 1.1、Vue3發布日期&#xff1a; 2020年9月18日 1.2、Vue3做了哪些升級&#xff1a; 1.2.1、性能的提升 官方發版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 打包大小減少41%初次渲染快55%更新渲染快133%內容減少54% 1.2.2、源碼的優化…

.net core webapi/mvc阿里云服務器部署 - 錯誤解決

錯誤及解決方案缺少web.config配置HTTP 錯誤 500.19 - Internal Server Error檢查 IIS 配置1. 確保 .NET Core Hosting Bundle 已安裝2. 檢查 應用程序池 配置3. 檢查 IIS MIME 類型檢查文件權限1. 確保 IIS 用戶 有權限訪問網站目錄2. 檢查 web.config 文件權限啟用詳細錯誤日…

多輸入(input)多輸出(output)驗證

#作者&#xff1a;程宏斌 文章目錄前言Flb 1.9.4 INCLUDE配置測試測試方案測試配置文件測試命令Flb 3.0.2 INCLUDE配置測試測試方案測試配置文件啟動命令結論結論一&#xff1a;結論二&#xff1a;前言 需要設計并執行一組測試用例&#xff0c;這些測試用例將包括以子文件形式…

行業學習【電商】:垂直電商如何理解?以專業寵物平臺為例

聲明&#xff1a;以下部分內容含AI生成 “寵物等愛好者的專業平臺”指的是垂直電商的一個具體例子。 “垂直電商” 就是指不賣所有東西&#xff0c;只深耕某一個特定領域&#xff08;即“垂直”領域&#xff09;的電商平臺。 “寵物愛好者的專業平臺”就是這樣一個專門為養寵…

GPT(Generative Pre-trained Transformer)模型架構與損失函數介紹

目錄 一、核心架構&#xff1a;Transformer Decoder 1. 核心組件&#xff1a;僅解碼器&#xff08;Decoder-Only&#xff09;的堆疊 2. 輸入表示&#xff1a;Token 位置 3. 輸出 二、訓練過程&#xff1a;兩階段范式 階段一&#xff1a;預訓練&#xff08;Pre-training&…

GitHub 熱榜項目 - 日榜(2025-09-10)

GitHub 熱榜項目 - 日榜(2025-09-10) 生成于&#xff1a;2025-09-10 統計摘要 共發現熱門項目&#xff1a;15 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術熱點&#xff1a;LLM智能體應用爆發&#xff08;如parlant、AutoAgent&#xff09;&a…

論文閱讀:arxiv 2023 Large Language Models are Not Stable Recommender Systems

總目錄 大模型相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2312.15746 速覽 破解大語言模型在推薦系統中的不穩定性 該論文聚焦于大語言模型&#xff08;LLMs&#xff09;在推薦系統中的應用問題&#xff0c;指出…

Linux的使用——FinalShell下載使用及連接云服務器的教程

一、注冊免費阿里云服務器 1. 進入阿里云服務器官網 阿里云-計算&#xff0c;為了無法計算的價值https://www.aliyun.com/?spm5176.ecscore_server.console-base_top-nav.dlogo.39144df5uvPLOm 2. 點擊免費試用 這里我已經試用過了&#xff0c;大家選擇合適的云服務器點擊立…

如何清理 Docker 占用的巨大磁盤空間

我相信很多人在使用 Docker 一段時間后&#xff0c;都會遇到一個常見問題&#xff1a;磁盤空間被迅速吃光&#xff0c;尤其是在進行頻繁的鏡像構建、測試和運行容器時。以我自己為例&#xff0c;在 Ubuntu 24.04設備上&#xff0c;docker system df -v 一看&#xff0c;Docker …

【CMake】緩存變量

目錄 一. 緩存變量 二.創建緩存變量 2.1.使用set()來創建緩存變量 2.2.使用FORCE參數來覆蓋緩存變量 2.2.1.示例1——不帶force的set是不能覆蓋已經存在的緩存變量的 2.2.2.示例2——帶force的set才能覆蓋已經存在的緩存變量 2.2.3.對比示例 2.3.命令行 -D 創建/覆蓋緩…

vue2使用若依框架動態新增tab頁并存儲之前的tab頁的操作

1. 應用場景&#xff1a;點擊歷史記錄&#xff0c;要比較兩個tab頁的內容時&#xff0c;需要做到切換tab頁來回看左右對數據對比。2.開發難點若依項目正常是把路由配置到菜單管理里&#xff0c;都是設定好的。不過它也給我們寫好了動態新增tab頁的方&#xff0c;需要我們自己來…