女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL的組成結構與結構化查詢語言詳解

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2025-07-14 11:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

深入MySQL的組成結構與結構化查詢語言詳解

MySQL整體架構概述

MySQL作為世界上最流行的開源關系型數據庫管理系統,采用了分層架構設計。從整體上看,MySQL主要分為以下幾個層次:

1. 連接層(Connection Layer)

連接層負責處理客戶端的連接請求,包括:

?連接管理:建立、維護和銷毀客戶端連接

?身份驗證:用戶名、密碼驗證,權限檢查

?線程管理:為每個連接分配獨立的線程

?連接池管理:復用連接,減少連接開銷

2. 服務層(Service Layer)

服務層是MySQL的核心,包含了大多數MySQL功能:

?SQL接口:接收SQL語句并返回查詢結果

?解析器:詞法分析和語法分析

?優化器:查詢優化和執行計劃生成

?緩存:查詢緩存機制

?內置函數:日期、時間、數學、加密等函數

3. 引擎層(Engine Layer)

存儲引擎層負責數據的存儲和提取:

?可插拔設計:支持多種存儲引擎

?事務處理ACID特性支持

?鎖機制:并發控制

?索引管理:B+樹、哈希等索引結構

4. 存儲層(Storage Layer)

物理存儲層負責數據的持久化:

?數據文件:表數據存儲

?日志文件:事務日志、錯誤日志等

?索引文件:索引數據存儲

?配置文件:系統配置信息

MySQL核心組件詳解

連接器(Connector)

連接器是客戶端與MySQL服務器通信的橋梁:

-- 查看當前連接狀態
SHOWPROCESSLIST;

-- 查看連接相關參數
SHOWVARIABLESLIKE'%connect%';

-- 設置最大連接數
SETGLOBALmax_connections=1000;

關鍵配置參數:

?max_connections:最大連接數

?connect_timeout:連接超時時間

?wait_timeout:空閑連接超時時間

?interactive_timeout:交互式連接超時時間

查詢緩存(Query Cache)

查詢緩存用于緩存SELECT語句的結果:

-- 查看查詢緩存狀態
SHOWVARIABLESLIKE'query_cache%';

-- 查看查詢緩存統計信息
SHOWSTATUSLIKE'Qcache%';

-- 清理查詢緩存
FLUSH QUERY CACHE;
RESET QUERY CACHE;

注意事項:

? MySQL 8.0已移除查詢緩存功能

? 查詢緩存在高并發場景下可能成為性能瓶頸

? 適用于讀多寫少的應用場景

解析器(Parser)

解析器負責SQL語句的詞法和語法分析:

詞法分析階段:

? 識別SQL關鍵字、標識符、操作符

? 檢查語法錯誤

? 生成詞法單元序列

語法分析階段:

? 構建抽象語法樹(AST)

? 驗證SQL語句的語法正確性

? 準備后續優化處理

優化器(Optimizer)

優化器是MySQL的核心組件,負責生成最優執行計劃:

-- 查看執行計劃
EXPLAINSELECT*FROMusersWHEREage>25;

-- 查看詳細執行計劃
EXPLAIN FORMAT=JSONSELECT*FROMusersWHEREage>25;

-- 查看優化器追蹤信息
SEToptimizer_trace='enabled=on';
SELECT*FROMusersWHEREage>25;
SELECT*FROMinformation_schema.optimizer_trace;

優化器類型:

?基于規則的優化(RBO):根據預定義規則優化

?基于成本的優化(CBO):根據統計信息估算成本

執行器(Executor)

執行器負責執行優化后的SQL語句:

-- 查看執行統計信息
SHOWSTATUSLIKE'Handler%';

-- 查看慢查詢日志
SHOWVARIABLESLIKE'slow_query_log%';
SETGLOBALslow_query_log='ON';
SETGLOBALlong_query_time=2;

存儲引擎體系

InnoDB存儲引擎

InnoDB是MySQL的默認存儲引擎,具有以下特點:

事務支持:

-- 查看事務隔離級別
SELECT@@transaction_isolation;

-- 設置事務隔離級別
SETSESSION transaction_isolation='READ-COMMITTED';

-- 事務操作示例
STARTTRANSACTION;
UPDATEaccountsSETbalance=balance-100WHEREid=1;
UPDATEaccountsSETbalance=balance+100WHEREid=2;
COMMIT;

行級鎖定:

-- 查看鎖狀態
SHOWENGINE INNODB STATUS;

-- 查看鎖等待情況
SELECT*FROMinformation_schema.innodb_locks;
SELECT*FROMinformation_schema.innodb_lock_waits;

外鍵約束:

-- 創建外鍵約束
CREATE TABLEorders (
  idINTPRIMARY KEY,
  customer_idINT,
 FOREIGN KEY(customer_id)REFERENCEScustomers(id)
);

-- 查看外鍵約束
SELECT*FROMinformation_schema.key_column_usage
WHEREreferenced_table_nameISNOT NULL;

MyISAM存儲引擎

MyISAM是MySQL早期的默認存儲引擎:

特點:

? 表級鎖定

? 不支持事務

? 支持全文索引

? 存儲空間小

-- 創建MyISAM表
CREATE TABLElogs (
  idINTPRIMARY KEY,
  message TEXT,
  created_atTIMESTAMP
) ENGINE=MyISAM;

-- 優化MyISAM表
OPTIMIZETABLElogs;

-- 修復MyISAM表
REPAIRTABLElogs;

Memory存儲引擎

Memory引擎將數據存儲在內存中:

-- 創建Memory表
CREATE TABLEsessions (
  session_idVARCHAR(32)PRIMARY KEY,
  user_idINT,
  last_activityTIMESTAMP
) ENGINE=MEMORY;

-- 查看Memory引擎配置
SHOWVARIABLESLIKE'max_heap_table_size';

其他存儲引擎

?Archive:用于數據歸檔

?CSV:以CSV格式存儲數據

?Federated:訪問遠程MySQL服務器

?NDB:用于MySQL Cluster

內存結構深入分析

全局內存區域

1. InnoDB緩沖池(Buffer Pool)

緩沖池是InnoDB最重要的內存結構:

-- 查看緩沖池狀態
SHOWENGINE INNODB STATUSG

-- 查看緩沖池配置
SHOWVARIABLESLIKE'innodb_buffer_pool%';

-- 配置緩沖池大小
SETGLOBALinnodb_buffer_pool_size=1073741824;-- 1GB

緩沖池管理:

?LRU鏈表:最近最少使用算法

?Free鏈表:空閑頁面管理

?Flush鏈表:臟頁管理

2. 重做日志緩沖(Redo Log Buffer)

-- 查看重做日志緩沖配置
SHOWVARIABLESLIKE'innodb_log_buffer_size';

-- 設置重做日志緩沖大小
SETGLOBALinnodb_log_buffer_size=16777216;-- 16MB

3. 額外內存池(Additional Memory Pool)

-- 查看額外內存池配置
SHOWVARIABLESLIKE'innodb_additional_mem_pool_size';

線程內存區域

1. 排序緩沖區(Sort Buffer)

-- 查看排序緩沖區配置
SHOWVARIABLESLIKE'sort_buffer_size';

-- 設置排序緩沖區大小
SETSESSION sort_buffer_size=2097152;-- 2MB

2. 連接緩沖區(Join Buffer)

-- 查看連接緩沖區配置
SHOWVARIABLESLIKE'join_buffer_size';

-- 設置連接緩沖區大小
SETSESSION join_buffer_size=262144;-- 256KB

3. 讀緩沖區(Read Buffer)

-- 查看讀緩沖區配置
SHOWVARIABLESLIKE'read_buffer_size';
SHOWVARIABLESLIKE'read_rnd_buffer_size';

磁盤結構詳解

系統表空間

系統表空間包含InnoDB數據字典和撤銷日志:

-- 查看系統表空間信息
SELECT*FROMinformation_schema.innodb_sys_tablespaces
WHEREname='innodb_system';

-- 查看系統表空間文件
SHOWVARIABLESLIKE'innodb_data_file_path';

獨立表空間

每個InnoDB表都有自己的表空間文件:

-- 啟用獨立表空間
SHOWVARIABLESLIKE'innodb_file_per_table';

-- 查看表空間信息
SELECT*FROMinformation_schema.innodb_sys_tablespaces;

-- 查看表空間文件
SELECT*FROMinformation_schema.files;

重做日志文件

重做日志用于事務恢復:

-- 查看重做日志配置
SHOWVARIABLESLIKE'innodb_log%';

-- 重做日志文件位置和大小
SHOWVARIABLESLIKE'innodb_log_group_home_dir';
SHOWVARIABLESLIKE'innodb_log_file_size';
SHOWVARIABLESLIKE'innodb_log_files_in_group';

撤銷日志

撤銷日志用于事務回滾:

-- 查看撤銷日志配置
SHOWVARIABLESLIKE'innodb_undo%';

-- 查看撤銷日志統計
SHOWENGINE INNODB STATUSG

二進制日志

二進制日志用于主從復制和數據恢復:

-- 啟用二進制日志
SHOWVARIABLESLIKE'log_bin';

-- 查看二進制日志文件
SHOWBINARYLOGS;

-- 查看二進制日志事件
SHOWBINLOG EVENTSIN'mysql-bin.000001';

-- 刷新二進制日志
FLUSHBINARYLOGS;

SQL語言體系概述

結構化查詢語言(SQL)是操作關系型數據庫的標準語言,分為四個主要部分:

SQL語言分類

1.DDL(Data Definition Language):數據定義語言

2.DML(Data Manipulation Language):數據操作語言

3.DQL(Data Query Language):數據查詢語言

4.DCL(Data Control Language):數據控制語言

SQL標準演進

?SQL-86:第一個SQL標準

?SQL-89:添加了外連接

?SQL-92:添加了新的數據類型和語法

?SQL-99:添加了正則表達式和面向對象特性

?SQL-2003:添加了XML功能

?SQL-2008:添加了MERGE語句和窗口函數

DDL數據定義語言

DDL用于定義和管理數據庫對象的結構。

數據庫操作

創建數據庫

-- 基本創建數據庫
CREATEDATABASE mydb;

-- 指定字符集和排序規則
CREATEDATABASE mydb
CHARACTER SETutf8mb4
COLLATEutf8mb4_unicode_ci;

-- 創建數據庫時檢查是否存在
CREATEDATABASE IFNOTEXISTSmydb;

修改數據庫

-- 修改數據庫字符集
ALTERDATABASE mydb
CHARACTER SETutf8mb4
COLLATEutf8mb4_unicode_ci;

-- 修改數據庫讀寫權限
ALTERDATABASE mydb READONLY=1;

刪除數據庫

-- 刪除數據庫
DROPDATABASE mydb;

-- 安全刪除數據庫
DROPDATABASE IFEXISTSmydb;

查看數據庫

-- 查看所有數據庫
SHOWDATABASES;

-- 查看數據庫創建語句
SHOWCREATEDATABASE mydb;

-- 查看當前數據庫
SELECTDATABASE();

表操作

創建表

-- 基本表創建
CREATE TABLEusers (
  idINTPRIMARY KEYAUTO_INCREMENT,
  usernameVARCHAR(50)NOT NULLUNIQUE,
  emailVARCHAR(100)NOT NULL,
  passwordVARCHAR(255)NOT NULL,
  created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,
  updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP
);

-- 創建表時指定存儲引擎和字符集
CREATE TABLEproducts (
  idINTPRIMARY KEYAUTO_INCREMENT,
  nameVARCHAR(100)NOT NULL,
  priceDECIMAL(10,2)NOT NULL,
  description TEXT,
  category_idINT,
  INDEX idx_category (category_id),
 FOREIGN KEY(category_id)REFERENCEScategories(id)
) ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

-- 復制表結構
CREATE TABLEusers_backupLIKEusers;

-- 復制表結構和數據
CREATE TABLEusers_backupASSELECT*FROMusers;

修改表結構

-- 添加列
ALTER TABLEusersADDCOLUMNphoneVARCHAR(20);
ALTER TABLEusersADDCOLUMNaddress TEXT AFTER email;

-- 修改列
ALTER TABLEusers MODIFYCOLUMNphoneVARCHAR(30);
ALTER TABLEusers CHANGECOLUMNphone mobileVARCHAR(30);

-- 刪除列
ALTER TABLEusersDROPCOLUMNaddress;

-- 添加索引
ALTER TABLEusersADDINDEX idx_username (username);
ALTER TABLEusersADDUNIQUEKEY uk_email (email);

-- 刪除索引
ALTER TABLEusersDROPINDEX idx_username;

-- 添加主鍵
ALTER TABLEusersADDPRIMARY KEY(id);

-- 刪除主鍵
ALTER TABLEusersDROPPRIMARY KEY;

-- 添加外鍵
ALTER TABLEordersADD CONSTRAINTfk_customer
FOREIGN KEY(customer_id)REFERENCEScustomers(id);

-- 刪除外鍵
ALTER TABLEordersDROPFOREIGN KEYfk_customer;

-- 修改表名
ALTER TABLEusers RENAMETOuser_accounts;
RENAMETABLEusersTOuser_accounts;

-- 修改表引擎
ALTER TABLEusers ENGINE=MyISAM;

-- 修改表字符集
ALTER TABLEusersCONVERTTOCHARACTER SETutf8mb4COLLATEutf8mb4_unicode_ci;

刪除表

-- 刪除表
DROPTABLEusers;

-- 安全刪除表
DROPTABLEIFEXISTSusers;

-- 刪除多個表
DROPTABLEusers, products, orders;

-- 清空表數據但保留結構
TRUNCATETABLEusers;

查看表信息

-- 查看所有表
SHOWTABLES;

-- 查看表結構
DESCRIBEusers;
DESCusers;
SHOWCOLUMNSFROMusers;

-- 查看表創建語句
SHOWCREATE TABLEusers;

-- 查看表狀態
SHOWTABLESTATUSLIKE'users';

-- 查看表索引
SHOWINDEXFROMusers;

索引操作

創建索引

-- 普通索引
CREATEINDEX idx_usernameONusers(username);

-- 唯一索引
CREATEUNIQUEINDEX uk_emailONusers(email);

-- 復合索引
CREATEINDEX idx_name_ageONusers(name, age);

-- 前綴索引
CREATEINDEX idx_email_prefixONusers(email(10));

-- 全文索引
CREATEFULLTEXT INDEX ft_contentONarticles(content);

-- 空間索引
CREATESPATIAL INDEX sp_locationONplaces(location);

刪除索引

-- 刪除索引
DROPINDEX idx_usernameONusers;

-- 刪除主鍵索引
ALTER TABLEusersDROPPRIMARY KEY;

-- 刪除外鍵索引
ALTER TABLEusersDROPFOREIGN KEYfk_constraint_name;

視圖操作

創建視圖

-- 基本視圖
CREATEVIEWuser_summaryAS
SELECTid, username, email, created_at
FROMusers
WHEREstatus='active';

-- 復雜視圖
CREATEVIEWorder_detailsAS
SELECT
  o.id,
  o.order_date,
  u.username,
  p.nameASproduct_name,
  oi.quantity,
  oi.price
FROMorders o
JOINusers uONo.user_id=u.id
JOINorder_items oiONo.id=oi.order_id
JOINproducts pONoi.product_id=p.id;

-- 可更新視圖
CREATEVIEWactive_usersAS
SELECTid, username, email
FROMusers
WHEREstatus='active'
WITHCHECKOPTION;

修改視圖

-- 修改視圖
ALTERVIEWuser_summaryAS
SELECTid, username, email, created_at, last_login
FROMusers
WHEREstatus='active';

-- 或者使用CREATE OR REPLACE
CREATEORREPLACEVIEWuser_summaryAS
SELECTid, username, email, created_at, last_login
FROMusers
WHEREstatus='active';

刪除視圖

-- 刪除視圖
DROPVIEWuser_summary;

-- 安全刪除視圖
DROPVIEWIFEXISTSuser_summary;

存儲過程和函數

創建存儲過程

DELIMITER//
CREATEPROCEDUREGetUserById(INuser_idINT)
BEGIN
 SELECT*FROMusersWHEREid=user_id;
END//
DELIMITER ;

-- 復雜存儲過程
DELIMITER//
CREATEPROCEDUREUpdateUserStatus(
 INp_user_idINT,
 INp_statusVARCHAR(20),
 OUTp_resultVARCHAR(50)
)
BEGIN
 DECLAREv_countINTDEFAULT0;
 
 SELECTCOUNT(*)INTOv_countFROMusersWHEREid=p_user_id;
 
  IF v_count>0THEN
   UPDATEusersSETstatus=p_statusWHEREid=p_user_id;
   SETp_result='Success';
 ELSE
   SETp_result='User not found';
 ENDIF;
END//
DELIMITER ;

創建函數

DELIMITER//
CREATEFUNCTIONGetUserCount()RETURNSINT
READSSQLDATA
DETERMINISTIC
BEGIN
 DECLAREuser_countINTDEFAULT0;
 SELECTCOUNT(*)INTOuser_countFROMusers;
 RETURNuser_count;
END//
DELIMITER ;

-- 調用函數
SELECTGetUserCount();

觸發器

創建觸發器

-- BEFORE INSERT觸發器
DELIMITER//
CREATETRIGGERbefore_user_insert
BEFOREINSERTONusers
FOREACHROW
BEGIN
 SETNEW.created_at=NOW();
 SETNEW.updated_at=NOW();
END//
DELIMITER ;

-- AFTER UPDATE觸發器
DELIMITER//
CREATETRIGGERafter_user_update
AFTERUPDATEONusers
FOREACHROW
BEGIN
 INSERT INTOuser_audit (user_id, action, old_value, new_value, changed_at)
 VALUES(NEW.id,'UPDATE', OLD.username, NEW.username, NOW());
END//
DELIMITER ;

-- BEFORE DELETE觸發器
DELIMITER//
CREATETRIGGERbefore_user_delete
BEFOREDELETEONusers
FOREACHROW
BEGIN
 INSERT INTOdeleted_usersSELECT*FROMusersWHEREid=OLD.id;
END//
DELIMITER ;

查看和刪除觸發器

-- 查看觸發器
SHOWTRIGGERS;

-- 刪除觸發器
DROPTRIGGERbefore_user_insert;

DML數據操作語言

DML用于對數據庫中的數據進行增刪改操作。

INSERT語句

基本插入

-- 插入單條記錄
INSERT INTOusers (username, email, password)
VALUES('john_doe','[email protected]','password123');

-- 插入多條記錄
INSERT INTOusers (username, email, password)VALUES
('alice','[email protected]','pass123'),
('bob','[email protected]','pass456'),
('charlie','[email protected]','pass789');

-- 插入所有字段
INSERT INTOusersVALUES
(NULL,'david','[email protected]','pass000', NOW(), NOW());

高級插入

-- 插入并忽略重復記錄
INSERTIGNOREINTOusers (username, email, password)
VALUES('john_doe','[email protected]','password123');

-- 插入或更新(ON DUPLICATE KEY UPDATE)
INSERT INTOusers (username, email, password)
VALUES('john_doe','[email protected]','new_password')
ONDUPLICATE KEYUPDATE
  email=VALUES(email),
  password=VALUES(password),
  updated_at=NOW();

-- 從其他表插入
INSERT INTOusers_backup (username, email, password)
SELECTusername, email, passwordFROMusersWHEREcreated_at>'2024-01-01';

-- 替換插入
REPLACEINTOusers (id, username, email, password)
VALUES(1,'john_doe','[email protected]','new_password');

UPDATE語句

基本更新

-- 更新單條記錄
UPDATEusers
SETemail='[email protected]', updated_at=NOW()
WHEREid=1;

-- 更新多條記錄
UPDATEusers
SETstatus='inactive'
WHERElast_login<'2024-01-01';

-- 更新所有記錄
UPDATE?users?SET?updated_at?=?NOW();

高級更新

-- 多表更新
UPDATEusers u
JOINorders oONu.id=o.user_id
SETu.total_orders=u.total_orders+1
WHEREo.order_date>'2024-01-01';

-- 條件更新
UPDATEusers
SETstatus=CASE
 WHENlast_login>'2024-06-01'THEN'active'
 WHENlast_login>'2024-01-01'THEN'inactive'
 ELSE'dormant'
END;

-- 限制更新記錄數
UPDATEusers
SETstatus='processed'
WHEREstatus='pending'
ORDERBYcreated_at
LIMIT100;

DELETE語句

基本刪除

-- 刪除單條記錄
DELETEFROMusersWHEREid=1;

-- 刪除多條記錄
DELETEFROMusersWHEREstatus='inactive';

-- 刪除所有記錄
DELETEFROMusers;

高級刪除

-- 多表刪除
DELETEu
FROMusers u
JOINorders oONu.id=o.user_id
WHEREo.order_date<'2020-01-01';

-- 限制刪除記錄數
DELETEFROM?users?
WHERE?status?='spam'
ORDERBY?created_at?
LIMIT?1000;

-- 安全刪除(使用事務)
START?TRANSACTION;
DELETEFROM?users?WHERE?id?=1;
-- 檢查結果
SELECT?ROW_COUNT();
COMMIT;?-- 或 ROLLBACK;

DQL數據查詢語言

DQL是SQL中最復雜也是最常用的部分,用于從數據庫中檢索數據。

基本SELECT語句

簡單查詢

-- 查詢所有字段
SELECT*FROMusers;

-- 查詢指定字段
SELECTid, username, emailFROMusers;

-- 使用別名
SELECT
  idASuser_id,
  usernameASlogin_name,
  emailASemail_address
FROMusers;

-- 去重查詢
SELECTDISTINCTstatusFROMusers;

-- 限制結果數量
SELECT*FROMusers LIMIT10;
SELECT*FROMusers LIMIT10,20;-- 跳過10條,取20條

WHERE條件查詢

基本條件

-- 等值查詢
SELECT*FROMusersWHEREstatus='active';

-- 不等值查詢
SELECT*FROMusersWHEREstatus!='inactive';
SELECT*FROMusersWHEREstatus<>'inactive';

-- 數值比較
SELECT*FROMusersWHEREage>25;
SELECT*FROMusersWHEREageBETWEEN18AND65;

-- 模糊查詢
SELECT*FROMusersWHEREusernameLIKE'john%';
SELECT*FROMusersWHEREemailLIKE'%@gmail.com';

-- 空值查詢
SELECT*FROMusersWHERElast_loginISNULL;
SELECT*FROMusersWHERElast_loginISNOT NULL;

-- 列表查詢
SELECT*FROMusersWHEREstatusIN('active','pending');
SELECT*FROMusersWHEREidNOTIN(1,2,3);

復合條件

-- 邏輯AND
SELECT*FROMusers
WHEREstatus='active'ANDage>25;

-- 邏輯OR
SELECT*FROMusers
WHEREstatus='active'ORstatus='pending';

-- 復雜條件組合
SELECT*FROMusers
WHERE(status='active'ORstatus='pending')
ANDageBETWEEN18AND65
ANDemailLIKE'%@gmail.com';

排序和分組

ORDER BY排序

-- 升序排序
SELECT*FROMusersORDERBYcreated_atASC;

-- 降序排序
SELECT*FROMusersORDERBYcreated_atDESC;

-- 多字段排序
SELECT*FROMusers
ORDERBYstatusASC, created_atDESC;

-- 使用表達式排序
SELECT*FROMusers
ORDERBYCHAR_LENGTH(username)DESC;

GROUP BY分組

-- 基本分組
SELECTstatus,COUNT(*)asuser_count
FROMusers
GROUPBYstatus;

-- 多字段分組
SELECTstatus,DATE(created_at)asdate,COUNT(*)ascount
FROMusers
GROUPBYstatus,DATE(created_at);

-- 分組后過濾
SELECTstatus,COUNT(*)asuser_count
FROMusers
GROUPBYstatus
HAVINGCOUNT(*)>10;

-- 分組與排序
SELECTstatus,COUNT(*)asuser_count
FROMusers
GROUPBYstatus
ORDERBYuser_countDESC;

聚合函數

常用聚合函數

-- 計數
SELECTCOUNT(*)FROMusers;
SELECTCOUNT(DISTINCTstatus)FROMusers;

-- 求和
SELECTSUM(order_amount)FROMorders;

-- 平均值
SELECTAVG(age)FROMusers;

-- 最大值和最小值
SELECTMAX(created_at),MIN(created_at)FROMusers;

-- 字符串連接
SELECTGROUP_CONCAT(username)FROMusers;
SELECTGROUP_CONCAT(username SEPARATOR', ')FROMusers;

窗口函數(MySQL 8.0+)

-- 行號
SELECT
  username,
  email,
 ROW_NUMBER()OVER(ORDERBYcreated_at)asrn
FROMusers;

-- 排名
SELECT
  username,
  age,
 RANK()OVER(ORDERBYageDESC)asrank,
 DENSE_RANK()OVER(ORDERBYageDESC)asdense_rank
FROMusers;

-- 分組排名
SELECT
  username,
  department,
  salary,
 RANK()OVER(PARTITIONBYdepartmentORDERBYsalaryDESC)asdept_rank
FROMemployees;

-- 累計求和
SELECT
  order_date,
  amount,
 SUM(amount)OVER(ORDERBYorder_date)asrunning_total
FROMorders;

-- 移動平均
SELECT
  order_date,
  amount,
 AVG(amount)OVER(ORDERBYorder_dateROWSBETWEEN2PRECEDINGANDCURRENTROW)asma3
FROMorders;

表連接

內連接(INNER JOIN)

-- 基本內連接
SELECTu.username, p.title
FROMusers u
INNERJOINposts pONu.id=p.user_id;

-- 多表內連接
SELECT
  u.username,
  p.title,
  c.nameascategory_name
FROMusers u
INNERJOINposts pONu.id=p.user_id
INNERJOINcategories cONp.category_id=c.id;

外連接(OUTER JOIN)

-- 左外連接
SELECTu.username, p.title
FROMusers u
LEFTJOINposts pONu.id=p.user_id;

-- 右外連接
SELECTu.username, p.title
FROMusers u
RIGHTJOINposts pONu.id=p.user_id;

-- 全外連接(MySQL不直接支持,需要用UNION)
SELECTu.username, p.title
FROMusers u
LEFTJOINposts pONu.id=p.user_id
UNION
SELECTu.username, p.title
FROMusers u
RIGHTJOINposts pONu.id=p.user_id;

自連接

-- 查找同部門的員工
SELECT
  e1.nameasemployee,
  e2.nameascolleague
FROMemployees e1
JOINemployees e2ONe1.department_id=e2.department_id
WHEREe1.id!=e2.id;

-- 查找員工及其直接上級
SELECT
  e.nameasemployee,
  m.nameasmanager
FROMemployees e
LEFTJOINemployees mONe.manager_id=m.id;

子查詢

標量子查詢

-- 查詢年齡大于平均年齡的用戶
SELECT*FROMusers
WHEREage>(SELECTAVG(age)FROMusers);

-- 查詢最新訂單的用戶
SELECT*FROMusers
WHEREid=(SELECTuser_idFROMordersORDERBYcreated_atDESCLIMIT1);

列子查詢

-- 查詢有訂單的用戶
SELECT*FROMusers
WHEREidIN(SELECTDISTINCTuser_idFROMorders);

-- 查詢沒有訂單的用戶
SELECT*FROMusers
WHEREidNOTIN(SELECTuser_idFROMordersWHEREuser_idISNOT NULL);

行子查詢

-- 查詢特定用戶的訂單信息
SELECT*FROMorders
WHERE(user_id, order_date)IN(
 SELECTuser_id,MAX(order_date)
 FROMorders
 GROUPBYuser_id
);

表子查詢

-- 使用子查詢作為臨時表
SELECTuser_stats.username, user_stats.order_count
FROM(
 SELECT
    u.username,
   COUNT(o.id)asorder_count
 FROMusers u
 LEFTJOINorders oONu.id=o.user_id
 GROUPBYu.id, u.username
)asuser_stats
WHEREuser_stats.order_count>5;

相關子查詢

-- 查詢每個用戶的最新訂單
SELECT*FROMorders o1
WHEREo1.created_at=(
 SELECTMAX(o2.created_at)
 FROMorders o2
 WHEREo2.user_id=o1.user_id
);

-- 使用EXISTS
SELECT*FROMusers u
WHEREEXISTS(
 SELECT1FROMorders o
 WHEREo.user_id=u.idANDo.status='completed'
);

高級查詢技巧

公用表表達式(CTE)- MySQL 8.0+

-- 基本CTE
WITHactive_usersAS(
 SELECTid, username, email
 FROMusers
 WHEREstatus='active'
)
SELECT*FROMactive_usersWHEREemailLIKE'%@gmail.com';

-- 遞歸CTE
WITHRECURSIVEemployee_hierarchyAS(
 -- 基礎查詢:頂級員工
 SELECTid, name, manager_id,0aslevel
 FROMemployees
 WHEREmanager_idISNULL
 
 UNIONALL
 
 -- 遞歸查詢:下級員工
 SELECTe.id, e.name, e.manager_id, eh.level+1
 FROMemployees e
 JOINemployee_hierarchy ehONe.manager_id=eh.id
)
SELECT*FROMemployee_hierarchyORDERBYlevel, name;

案例表達式

-- CASE WHEN
SELECT
  username,
  age,
 CASE
   WHENage<18THEN'未成年'
? ? ? ??WHEN?age?BETWEEN18AND65THEN'成年'
? ? ? ??ELSE'老年'
? ??ENDas?age_group
FROM?users;

-- 簡單CASE
SELECT
? ? username,
? ? status,
? ??CASE?status
? ? ? ??WHEN'active'THEN'活躍'
? ? ? ??WHEN'inactive'THEN'不活躍'
? ? ? ??ELSE'未知'
? ??ENDas?status_desc
FROM?users;

DCL數據控制語言

DCL用于控制數據庫的訪問權限和安全性。

用戶管理

創建用戶

-- 創建用戶
CREATEUSER'newuser'@'localhost'IDENTIFIEDBY'password123';

-- 創建用戶并指定主機
CREATEUSER'webuser'@'192.168.1.%'IDENTIFIEDBY'webpass';
CREATEUSER'appuser'@'%'IDENTIFIEDBY'apppass';

-- 創建用戶時指定密碼策略
CREATEUSER'secureuser'@'localhost'
IDENTIFIEDBY'SecurePass123!'
PASSWORD EXPIREINTERVAL90DAY;

修改用戶

-- 修改用戶密碼
ALTERUSER'newuser'@'localhost'IDENTIFIEDBY'newpassword';

-- 修改當前用戶密碼
ALTERUSERUSER() IDENTIFIEDBY'newpassword';

-- 設置密碼過期
ALTERUSER'newuser'@'localhost'PASSWORD EXPIRE;

-- 鎖定用戶
ALTERUSER'newuser'@'localhost'ACCOUNT LOCK;

-- 解鎖用戶
ALTERUSER'newuser'@'localhost'ACCOUNT UNLOCK;

刪除用戶

-- 刪除用戶
DROPUSER'newuser'@'localhost';

-- 刪除多個用戶
DROPUSER'user1'@'localhost','user2'@'localhost';

查看用戶

-- 查看所有用戶
SELECTuser, hostFROMmysql.user;

-- 查看當前用戶
SELECTUSER(),CURRENT_USER();

-- 查看用戶權限
SHOWGRANTSFOR'newuser'@'localhost';
SHOWGRANTSFORCURRENT_USER();

權限管理

授予權限

-- 授予數據庫所有權限
GRANTALLPRIVILEGESONmydb.*TO'newuser'@'localhost';

-- 授予特定表的權限
GRANTSELECT,INSERT,UPDATEONmydb.usersTO'newuser'@'localhost';

-- 授予特定列的權限
GRANTSELECT(id, username),UPDATE(email)ONmydb.usersTO'newuser'@'localhost';

-- 授予存儲過程權限
GRANTEXECUTEONPROCEDUREmydb.GetUserByIdTO'newuser'@'localhost';

-- 授予全局權限
GRANTREPLICATION SLAVEON*.*TO'repl_user'@'%';

-- 授予權限并允許授權給其他用戶
GRANTSELECTONmydb.*TO'newuser'@'localhost'WITHGRANTOPTION;

權限類型詳解

-- 數據操作權限
GRANTSELECTONmydb.*TO'readonly'@'localhost';
GRANTINSERTONmydb.*TO'insert_user'@'localhost';
GRANTUPDATEONmydb.*TO'update_user'@'localhost';
GRANTDELETEONmydb.*TO'delete_user'@'localhost';

-- 結構操作權限
GRANTCREATEONmydb.*TO'dev_user'@'localhost';
GRANTALTERONmydb.*TO'admin_user'@'localhost';
GRANTDROPONmydb.*TO'admin_user'@'localhost';
GRANTINDEXONmydb.*TO'dba_user'@'localhost';

-- 管理權限
GRANTPROCESSON*.*TO'monitor_user'@'localhost';
GRANTRELOADON*.*TO'backup_user'@'localhost';
GRANTREPLICATION CLIENTON*.*TO'repl_monitor'@'localhost';

回收權限

-- 回收特定權限
REVOKESELECTONmydb.usersFROM'newuser'@'localhost';

-- 回收所有權限
REVOKEALLPRIVILEGESONmydb.*FROM'newuser'@'localhost';

-- 回收授權權限
REVOKEGRANTOPTIONONmydb.*FROM'newuser'@'localhost';

刷新權限

-- 刷新權限緩存
FLUSH PRIVILEGES;

角色管理(MySQL 8.0+)

創建角色

-- 創建角色
CREATEROLE'app_developer','app_read','app_write';

-- 授予角色權限
GRANTSELECT,INSERT,UPDATEONmydb.*TO'app_developer';
GRANTSELECTONmydb.*TO'app_read';
GRANTINSERT,UPDATEONmydb.*TO'app_write';

-- 將角色授予用戶
GRANT'app_developer'TO'dev_user'@'localhost';
GRANT'app_read'TO'readonly_user'@'localhost';

-- 設置默認角色
SETDEFAULTROLE'app_developer'TO'dev_user'@'localhost';

角色繼承

-- 創建角色層次結構
CREATEROLE'base_role','advanced_role','admin_role';

-- 基礎角色權限
GRANTSELECTONmydb.*TO'base_role';

-- 高級角色繼承基礎角色
GRANT'base_role'TO'advanced_role';
GRANTINSERT,UPDATEONmydb.*TO'advanced_role';

-- 管理員角色繼承高級角色
GRANT'advanced_role'TO'admin_role';
GRANTDELETE,CREATE,ALTERONmydb.*TO'admin_role';

安全配置

密碼策略

-- 查看密碼策略
SHOWVARIABLESLIKE'validate_password%';

-- 設置密碼策略
SETGLOBALvalidate_password.policy='STRONG';
SETGLOBALvalidate_password.length=12;
SETGLOBALvalidate_password.mixed_case_count=2;
SETGLOBALvalidate_password.number_count=2;
SETGLOBALvalidate_password.special_char_count=2;

連接限制

-- 創建用戶時設置連接限制
CREATEUSER'limited_user'@'localhost'
IDENTIFIEDBY'password'
WITHMAX_CONNECTIONS_PER_HOUR100
MAX_QUERIES_PER_HOUR1000
MAX_UPDATES_PER_HOUR100
MAX_USER_CONNECTIONS5;

-- 修改用戶連接限制
ALTERUSER'limited_user'@'localhost'
WITHMAX_CONNECTIONS_PER_HOUR50;

SSL配置

-- 要求SSL連接
CREATEUSER'secure_user'@'%'
IDENTIFIEDBY'password'
REQUIRE SSL;

-- 要求特定的SSL證書
CREATEUSER'cert_user'@'%'
IDENTIFIEDBY'password'
REQUIRE X509;

-- 要求特定的SSL密鑰
CREATEUSER'key_user'@'%'
IDENTIFIEDBY'password'
REQUIRE SUBJECT'/C=US/ST=CA/L=San Francisco/O=MyOrg/CN=MyName';

性能優化與運維實踐

查詢優化

執行計劃分析

-- 基本執行計劃
EXPLAINSELECT*FROMusersWHEREage>25;

-- 詳細執行計劃
EXPLAIN FORMAT=JSONSELECT*FROMusersWHEREage>25;

-- 查看實際執行統計
EXPLAIN ANALYZESELECT*FROMusersWHEREage>25;

索引優化策略

-- 創建合適的索引
CREATEINDEX idx_ageONusers(age);
CREATEINDEX idx_status_createdONusers(status, created_at);

-- 查看索引使用情況
SHOWINDEXFROMusers;

-- 分析索引效率
SELECT
  table_name,
  index_name,
 cardinality,
  nullable
FROMinformation_schema.statistics
WHEREtable_schema='mydb';

監控與維護

性能監控

-- 查看慢查詢
SHOWVARIABLESLIKE'slow_query_log%';
SHOWSTATUSLIKE'Slow_queries';

-- 查看連接狀態
SHOWSTATUSLIKE'Connections';
SHOWSTATUSLIKE'Threads_%';

-- 查看緩存命中率
SHOWSTATUSLIKE'Key_read%';
SHOWSTATUSLIKE'Innodb_buffer_pool_read%';

-- 查看鎖等待
SHOWSTATUSLIKE'Innodb_row_lock_%';

表維護

-- 分析表
ANALYZETABLEusers;

-- 優化表
OPTIMIZETABLEusers;

-- 檢查表
CHECKTABLEusers;

-- 修復表
REPAIRTABLEusers;

備份與恢復

邏輯備份

# 備份單個數據庫
mysqldump -u root -p mydb > mydb_backup.sql

# 備份所有數據庫
mysqldump -u root -p --all-databases > all_databases_backup.sql

# 備份表結構
mysqldump -u root -p --no-data mydb > mydb_structure.sql

# 恢復數據庫
mysql -u root -p mydb < mydb_backup.sql

物理備份

-- 創建備份目錄
SETGLOBALlocal_infile=1;

-- 導出數據到文件
SELECT*INTOOUTFILE'/tmp/users_backup.csv'
FIELDS TERMINATEDBY','
LINES TERMINATEDBY'
'
FROMusers;

-- 從文件導入數據
LOAD DATA INFILE'/tmp/users_backup.csv'
INTOTABLEusers
FIELDS TERMINATEDBY','
LINES TERMINATEDBY'
';

主從復制配置

主庫配置

-- 啟用二進制日志
SETGLOBALlog_bin='mysql-bin';

-- 創建復制用戶
CREATEUSER'repl'@'slave_host'IDENTIFIEDBY'repl_password';
GRANTREPLICATION SLAVEON*.*TO'repl'@'slave_host';

-- 查看主庫狀態
SHOWMASTER STATUS;

從庫配置

-- 配置主庫信息
CHANGE MASTERTO
  MASTER_HOST='master_host',
  MASTER_USER='repl',
  MASTER_PASSWORD='repl_password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;

-- 啟動復制
STARTSLAVE;

-- 查看從庫狀態
SHOWSLAVE STATUSG;

總結

本文深入探討了MySQL的架構組成和SQL語言體系,涵蓋了從基礎概念到高級應用的各個方面。作為運維工程師,掌握這些知識對于數據庫的日常管理、性能優化和故障排除至關重要。

關鍵要點回顧

1.MySQL架構理解:分層架構設計使得MySQL具有良好的擴展性和靈活性

2.存儲引擎選擇:InnoDB適合事務處理,MyISAM適合讀密集型應用

3.內存管理:合理配置緩沖池大小對性能影響巨大

4.SQL語言掌握:熟練使用DDL、DML、DQL、DCL是基本技能

5.性能優化:索引設計、查詢優化、監控調優是持續過程

6.安全管理:用戶權限控制、數據備份恢復是安全保障

運維最佳實踐

1.定期監控:建立完善的監控體系,及時發現問題

2.備份策略:制定并執行定期備份計劃,確保數據安全

3.性能調優:持續優化查詢語句和索引設計

4.安全加固:定期審核用戶權限,加強訪問控制

5.容量規劃:根據業務增長預估資源需求

6.故障預案:制定詳細的故障處理流程和恢復方案

通過深入理解MySQL的內部機制和熟練掌握SQL語言,運維工程師能夠更好地管理和優化數據庫系統,確保業務的穩定運行和數據的安全可靠。隨著業務的發展和技術的進步,持續學習和實踐是每個運維工程師必須具備的素質。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3926

    瀏覽量

    66200
  • 管理系統
    +關注

    關注

    1

    文章

    2766

    瀏覽量

    37037
  • MySQL
    +關注

    關注

    1

    文章

    860

    瀏覽量

    27922

原文標題:一文徹底搞懂MySQL組成結構及SQL高效查詢技巧(附大廠經驗)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    結構化布線系統有哪些難題

      在布線系統中,結構化布線也是非常重要的一環,這里本文給大家主要講解了結構化布線系統的規劃、安裝以及投資成本等問題,希望對您有所幫助。  結構化布線系統規劃  大多數電纜廠商為它們的產品規定了15
    發表于 05-19 13:46

    TrustZone結構化消息是什么?

    大家好,我已閱讀任何與TrustZone相關的內容,但我無法弄清楚這兩個世界是如何相互溝通的。我所能找到的只是TrustZone API規范中的內容:客戶端和服務可以通過兩種機制進行通信:結構化
    發表于 03-20 08:58

    Deeplearningai結構化機器學習項目

    Deeplearningai 結構化機器學習項目 Week2 6-10
    發表于 05-18 15:12

    結構化匯編語言的監控程序設計思想

    微型計算機控制技術_第五章第5章 常用應用程序設計 本章以51單片機為基礎,主要介紹結構化匯編語言的監控程序設計思想和實時測控系統中最常用的數字濾波技術、標度變換、插值算法以及報警程序設計等。 程序
    發表于 09-10 06:50

    結構化設計分為哪幾部分?結構化設計的要求有哪些

    結構化設計分為哪幾部分?結構化設計的要求有哪些?結構化設計主要包括哪些部分?
    發表于 12-23 06:15

    結構化布線的綜合說明

    結構化布線的綜合說明 一、結構化布線系統簡介     隨著計算機和通信技術的飛速發展,網絡應用
    發表于 04-14 17:16 ?808次閱讀

    什么叫結構化的算法_算法和結構化數據初識

    結構化算法是由一些基本結構順序組成的,就是把一個大的功能的實現分隔為許多個小功能的實現。在基本結構之間不存在向前或向后的跳轉,流程的轉移只存在于一個基本的
    發表于 01-03 16:09 ?1.2w次閱讀
    什么叫<b class='flag-5'>結構化</b>的算法_算法和<b class='flag-5'>結構化</b>數據初識

    結構化布線系統的四點注意事項

    布線系統結構化 結構化布線 title=結構化布線結構化布線 title=結構化布線結構化布線系
    發表于 10-16 10:52 ?1369次閱讀

    Visual FoxPro程序設計教程之結構化查詢語言SQL的詳細資料合集

    本文檔的詳細介紹的是Visual FoxPro程序設計教程之結構化查詢語言SQL的詳細資料合集主要內容包括了:1 SQL語言概述,2 SQL的定義功能,3 SQL的
    發表于 03-04 16:21 ?3次下載
    Visual FoxPro程序設計教程之<b class='flag-5'>結構化</b><b class='flag-5'>查詢</b><b class='flag-5'>語言</b>SQL的詳細資料合集

    結構化查詢語言SQL的使用詳解

    本章講授結構化査詢語言SQL,它是關系數據庫的標準語言,具有強大的功能。在它的四大功能中,重點介紹數據查詢功能。
    發表于 07-06 17:08 ?0次下載
    <b class='flag-5'>結構化</b><b class='flag-5'>查詢</b><b class='flag-5'>語言</b>SQL的使用<b class='flag-5'>詳解</b>

    結構化文本語言ST編程的學習課件

    文本呢?“結構”是指高水平的結構化編程能力,象一個“結構化的編程”;“文本”是指應用文本而不是梯形圖和順序函功能表的能力。ST語言不能代替其它的語言
    發表于 12-28 08:00 ?20次下載
    <b class='flag-5'>結構化</b>文本<b class='flag-5'>語言</b>ST編程的學習課件

    匯編語言結構化設計程序教程

    匯編語言結構化設計程序教程說明。
    發表于 03-26 09:38 ?24次下載

    C語言程序設計第四講結構化程序設計之選擇

    C語言程序設計第四講結構化程序設計之選擇
    發表于 12-22 10:34 ?0次下載

    西門子博途S7-SCL結構化控制語言編程

    最近幾年結構化文本編程已經越來越盛行,使用結構化文本語言編程的人數已經超過了使用梯形圖編程的人數,大量的PLC工程師從中受益。
    發表于 06-11 11:05 ?1219次閱讀
    西門子博途S7-SCL<b class='flag-5'>結構化</b>控制<b class='flag-5'>語言</b>編程

    結構化布線的好處多嗎

    結構化布線是網絡系統中的重要組成部分,因為它為數據傳輸提供了強大、可擴展且可靠的基礎。通過遵守全球公認的標準,結構化布線可促進高速連接、簡化故障排除并確保未來的可擴展性??紤]到這些優勢,企業應優先
    的頭像 發表于 04-07 11:15 ?713次閱讀