深入MySQL的組成結(jié)構(gòu)與結(jié)構(gòu)化查詢語言詳解
MySQL整體架構(gòu)概述
MySQL作為世界上最流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),采用了分層架構(gòu)設(shè)計(jì)。從整體上看,MySQL主要分為以下幾個(gè)層次:
1. 連接層(Connection Layer)
連接層負(fù)責(zé)處理客戶端的連接請(qǐng)求,包括:
?連接管理:建立、維護(hù)和銷毀客戶端連接
?身份驗(yàn)證:用戶名、密碼驗(yàn)證,權(quán)限檢查
?線程管理:為每個(gè)連接分配獨(dú)立的線程
?連接池管理:復(fù)用連接,減少連接開銷
2. 服務(wù)層(Service Layer)
服務(wù)層是MySQL的核心,包含了大多數(shù)MySQL功能:
?SQL接口:接收SQL語句并返回查詢結(jié)果
?解析器:詞法分析和語法分析
?優(yōu)化器:查詢優(yōu)化和執(zhí)行計(jì)劃生成
?緩存:查詢緩存機(jī)制
?內(nèi)置函數(shù):日期、時(shí)間、數(shù)學(xué)、加密等函數(shù)
3. 引擎層(Engine Layer)
存儲(chǔ)引擎層負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和提?。?/p>
?可插拔設(shè)計(jì):支持多種存儲(chǔ)引擎
?事務(wù)處理:ACID特性支持
?鎖機(jī)制:并發(fā)控制
?索引管理:B+樹、哈希等索引結(jié)構(gòu)
4. 存儲(chǔ)層(Storage Layer)
物理存儲(chǔ)層負(fù)責(zé)數(shù)據(jù)的持久化:
?數(shù)據(jù)文件:表數(shù)據(jù)存儲(chǔ)
?日志文件:事務(wù)日志、錯(cuò)誤日志等
?索引文件:索引數(shù)據(jù)存儲(chǔ)
?配置文件:系統(tǒng)配置信息
MySQL核心組件詳解
連接器(Connector)
連接器是客戶端與MySQL服務(wù)器通信的橋梁:
-- 查看當(dāng)前連接狀態(tài) SHOWPROCESSLIST; -- 查看連接相關(guān)參數(shù) SHOWVARIABLESLIKE'%connect%'; -- 設(shè)置最大連接數(shù) SETGLOBALmax_connections=1000;
關(guān)鍵配置參數(shù):
?max_connections:最大連接數(shù)
?connect_timeout:連接超時(shí)時(shí)間
?wait_timeout:空閑連接超時(shí)時(shí)間
?interactive_timeout:交互式連接超時(shí)時(shí)間
查詢緩存(Query Cache)
查詢緩存用于緩存SELECT語句的結(jié)果:
-- 查看查詢緩存狀態(tài) SHOWVARIABLESLIKE'query_cache%'; -- 查看查詢緩存統(tǒng)計(jì)信息 SHOWSTATUSLIKE'Qcache%'; -- 清理查詢緩存 FLUSH QUERY CACHE; RESET QUERY CACHE;
注意事項(xiàng):
? MySQL 8.0已移除查詢緩存功能
? 查詢緩存在高并發(fā)場(chǎng)景下可能成為性能瓶頸
? 適用于讀多寫少的應(yīng)用場(chǎng)景
解析器(Parser)
解析器負(fù)責(zé)SQL語句的詞法和語法分析:
詞法分析階段:
? 識(shí)別SQL關(guān)鍵字、標(biāo)識(shí)符、操作符
? 檢查語法錯(cuò)誤
? 生成詞法單元序列
語法分析階段:
? 構(gòu)建抽象語法樹(AST)
? 驗(yàn)證SQL語句的語法正確性
? 準(zhǔn)備后續(xù)優(yōu)化處理
優(yōu)化器(Optimizer)
優(yōu)化器是MySQL的核心組件,負(fù)責(zé)生成最優(yōu)執(zhí)行計(jì)劃:
-- 查看執(zhí)行計(jì)劃 EXPLAINSELECT*FROMusersWHEREage>25; -- 查看詳細(xì)執(zhí)行計(jì)劃 EXPLAIN FORMAT=JSONSELECT*FROMusersWHEREage>25; -- 查看優(yōu)化器追蹤信息 SEToptimizer_trace='enabled=on'; SELECT*FROMusersWHEREage>25; SELECT*FROMinformation_schema.optimizer_trace;
優(yōu)化器類型:
?基于規(guī)則的優(yōu)化(RBO):根據(jù)預(yù)定義規(guī)則優(yōu)化
?基于成本的優(yōu)化(CBO):根據(jù)統(tǒng)計(jì)信息估算成本
執(zhí)行器(Executor)
執(zhí)行器負(fù)責(zé)執(zhí)行優(yōu)化后的SQL語句:
-- 查看執(zhí)行統(tǒng)計(jì)信息 SHOWSTATUSLIKE'Handler%'; -- 查看慢查詢?nèi)罩?SHOWVARIABLESLIKE'slow_query_log%'; SETGLOBALslow_query_log='ON'; SETGLOBALlong_query_time=2;
存儲(chǔ)引擎體系
InnoDB存儲(chǔ)引擎
InnoDB是MySQL的默認(rèn)存儲(chǔ)引擎,具有以下特點(diǎn):
事務(wù)支持:
-- 查看事務(wù)隔離級(jí)別 SELECT@@transaction_isolation; -- 設(shè)置事務(wù)隔離級(jí)別 SETSESSION transaction_isolation='READ-COMMITTED'; -- 事務(wù)操作示例 STARTTRANSACTION; UPDATEaccountsSETbalance=balance-100WHEREid=1; UPDATEaccountsSETbalance=balance+100WHEREid=2; COMMIT;
行級(jí)鎖定:
-- 查看鎖狀態(tài) SHOWENGINE INNODB STATUS; -- 查看鎖等待情況 SELECT*FROMinformation_schema.innodb_locks; SELECT*FROMinformation_schema.innodb_lock_waits;
外鍵約束:
-- 創(chuàng)建外鍵約束 CREATE TABLEorders ( idINTPRIMARY KEY, customer_idINT, FOREIGN KEY(customer_id)REFERENCEScustomers(id) ); -- 查看外鍵約束 SELECT*FROMinformation_schema.key_column_usage WHEREreferenced_table_nameISNOT NULL;
MyISAM存儲(chǔ)引擎
MyISAM是MySQL早期的默認(rèn)存儲(chǔ)引擎:
特點(diǎn):
? 表級(jí)鎖定
? 不支持事務(wù)
? 支持全文索引
? 存儲(chǔ)空間小
-- 創(chuàng)建MyISAM表 CREATE TABLElogs ( idINTPRIMARY KEY, message TEXT, created_atTIMESTAMP ) ENGINE=MyISAM; -- 優(yōu)化MyISAM表 OPTIMIZETABLElogs; -- 修復(fù)MyISAM表 REPAIRTABLElogs;
Memory存儲(chǔ)引擎
Memory引擎將數(shù)據(jù)存儲(chǔ)在內(nèi)存中:
-- 創(chuàng)建Memory表 CREATE TABLEsessions ( session_idVARCHAR(32)PRIMARY KEY, user_idINT, last_activityTIMESTAMP ) ENGINE=MEMORY; -- 查看Memory引擎配置 SHOWVARIABLESLIKE'max_heap_table_size';
其他存儲(chǔ)引擎
?Archive:用于數(shù)據(jù)歸檔
?CSV:以CSV格式存儲(chǔ)數(shù)據(jù)
?Federated:訪問遠(yuǎn)程MySQL服務(wù)器
?NDB:用于MySQL Cluster
內(nèi)存結(jié)構(gòu)深入分析
全局內(nèi)存區(qū)域
1. InnoDB緩沖池(Buffer Pool)
緩沖池是InnoDB最重要的內(nèi)存結(jié)構(gòu):
-- 查看緩沖池狀態(tài) 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'; -- 設(shè)置重做日志緩沖大小 SETGLOBALinnodb_log_buffer_size=16777216;-- 16MB
3. 額外內(nèi)存池(Additional Memory Pool)
-- 查看額外內(nèi)存池配置 SHOWVARIABLESLIKE'innodb_additional_mem_pool_size';
線程內(nèi)存區(qū)域
1. 排序緩沖區(qū)(Sort Buffer)
-- 查看排序緩沖區(qū)配置 SHOWVARIABLESLIKE'sort_buffer_size'; -- 設(shè)置排序緩沖區(qū)大小 SETSESSION sort_buffer_size=2097152;-- 2MB
2. 連接緩沖區(qū)(Join Buffer)
-- 查看連接緩沖區(qū)配置 SHOWVARIABLESLIKE'join_buffer_size'; -- 設(shè)置連接緩沖區(qū)大小 SETSESSION join_buffer_size=262144;-- 256KB
3. 讀緩沖區(qū)(Read Buffer)
-- 查看讀緩沖區(qū)配置 SHOWVARIABLESLIKE'read_buffer_size'; SHOWVARIABLESLIKE'read_rnd_buffer_size';
磁盤結(jié)構(gòu)詳解
系統(tǒng)表空間
系統(tǒng)表空間包含InnoDB數(shù)據(jù)字典和撤銷日志:
-- 查看系統(tǒng)表空間信息 SELECT*FROMinformation_schema.innodb_sys_tablespaces WHEREname='innodb_system'; -- 查看系統(tǒng)表空間文件 SHOWVARIABLESLIKE'innodb_data_file_path';
獨(dú)立表空間
每個(gè)InnoDB表都有自己的表空間文件:
-- 啟用獨(dú)立表空間 SHOWVARIABLESLIKE'innodb_file_per_table'; -- 查看表空間信息 SELECT*FROMinformation_schema.innodb_sys_tablespaces; -- 查看表空間文件 SELECT*FROMinformation_schema.files;
重做日志文件
重做日志用于事務(wù)恢復(fù):
-- 查看重做日志配置 SHOWVARIABLESLIKE'innodb_log%'; -- 重做日志文件位置和大小 SHOWVARIABLESLIKE'innodb_log_group_home_dir'; SHOWVARIABLESLIKE'innodb_log_file_size'; SHOWVARIABLESLIKE'innodb_log_files_in_group';
撤銷日志
撤銷日志用于事務(wù)回滾:
-- 查看撤銷日志配置 SHOWVARIABLESLIKE'innodb_undo%'; -- 查看撤銷日志統(tǒng)計(jì) SHOWENGINE INNODB STATUSG
二進(jìn)制日志
二進(jìn)制日志用于主從復(fù)制和數(shù)據(jù)恢復(fù):
-- 啟用二進(jìn)制日志 SHOWVARIABLESLIKE'log_bin'; -- 查看二進(jìn)制日志文件 SHOWBINARYLOGS; -- 查看二進(jìn)制日志事件 SHOWBINLOG EVENTSIN'mysql-bin.000001'; -- 刷新二進(jìn)制日志 FLUSHBINARYLOGS;
SQL語言體系概述
結(jié)構(gòu)化查詢語言(SQL)是操作關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,分為四個(gè)主要部分:
SQL語言分類
1.DDL(Data Definition Language):數(shù)據(jù)定義語言
2.DML(Data Manipulation Language):數(shù)據(jù)操作語言
3.DQL(Data Query Language):數(shù)據(jù)查詢語言
4.DCL(Data Control Language):數(shù)據(jù)控制語言
SQL標(biāo)準(zhǔn)演進(jìn)
?SQL-86:第一個(gè)SQL標(biāo)準(zhǔn)
?SQL-89:添加了外連接
?SQL-92:添加了新的數(shù)據(jù)類型和語法
?SQL-99:添加了正則表達(dá)式和面向?qū)ο筇匦?/p>
?SQL-2003:添加了XML功能
?SQL-2008:添加了MERGE語句和窗口函數(shù)
DDL數(shù)據(jù)定義語言
DDL用于定義和管理數(shù)據(jù)庫對(duì)象的結(jié)構(gòu)。
數(shù)據(jù)庫操作
創(chuàng)建數(shù)據(jù)庫
-- 基本創(chuàng)建數(shù)據(jù)庫 CREATEDATABASE mydb; -- 指定字符集和排序規(guī)則 CREATEDATABASE mydb CHARACTER SETutf8mb4 COLLATEutf8mb4_unicode_ci; -- 創(chuàng)建數(shù)據(jù)庫時(shí)檢查是否存在 CREATEDATABASE IFNOTEXISTSmydb;
修改數(shù)據(jù)庫
-- 修改數(shù)據(jù)庫字符集 ALTERDATABASE mydb CHARACTER SETutf8mb4 COLLATEutf8mb4_unicode_ci; -- 修改數(shù)據(jù)庫讀寫權(quán)限 ALTERDATABASE mydb READONLY=1;
刪除數(shù)據(jù)庫
-- 刪除數(shù)據(jù)庫 DROPDATABASE mydb; -- 安全刪除數(shù)據(jù)庫 DROPDATABASE IFEXISTSmydb;
查看數(shù)據(jù)庫
-- 查看所有數(shù)據(jù)庫 SHOWDATABASES; -- 查看數(shù)據(jù)庫創(chuàng)建語句 SHOWCREATEDATABASE mydb; -- 查看當(dāng)前數(shù)據(jù)庫 SELECTDATABASE();
表操作
創(chuàng)建表
-- 基本表創(chuàng)建 CREATE TABLEusers ( idINTPRIMARY KEYAUTO_INCREMENT, usernameVARCHAR(50)NOT NULLUNIQUE, emailVARCHAR(100)NOT NULL, passwordVARCHAR(255)NOT NULL, created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP, updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP ); -- 創(chuàng)建表時(shí)指定存儲(chǔ)引擎和字符集 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; -- 復(fù)制表結(jié)構(gòu) CREATE TABLEusers_backupLIKEusers; -- 復(fù)制表結(jié)構(gòu)和數(shù)據(jù) CREATE TABLEusers_backupASSELECT*FROMusers;
修改表結(jié)構(gòu)
-- 添加列 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; -- 刪除多個(gè)表 DROPTABLEusers, products, orders; -- 清空表數(shù)據(jù)但保留結(jié)構(gòu) TRUNCATETABLEusers;
查看表信息
-- 查看所有表 SHOWTABLES; -- 查看表結(jié)構(gòu) DESCRIBEusers; DESCusers; SHOWCOLUMNSFROMusers; -- 查看表創(chuàng)建語句 SHOWCREATE TABLEusers; -- 查看表狀態(tài) SHOWTABLESTATUSLIKE'users'; -- 查看表索引 SHOWINDEXFROMusers;
索引操作
創(chuàng)建索引
-- 普通索引 CREATEINDEX idx_usernameONusers(username); -- 唯一索引 CREATEUNIQUEINDEX uk_emailONusers(email); -- 復(fù)合索引 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;
視圖操作
創(chuàng)建視圖
-- 基本視圖 CREATEVIEWuser_summaryAS SELECTid, username, email, created_at FROMusers WHEREstatus='active'; -- 復(fù)雜視圖 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;
存儲(chǔ)過程和函數(shù)
創(chuàng)建存儲(chǔ)過程
DELIMITER// CREATEPROCEDUREGetUserById(INuser_idINT) BEGIN SELECT*FROMusersWHEREid=user_id; END// DELIMITER ; -- 復(fù)雜存儲(chǔ)過程 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 ;
創(chuàng)建函數(shù)
DELIMITER// CREATEFUNCTIONGetUserCount()RETURNSINT READSSQLDATA DETERMINISTIC BEGIN DECLAREuser_countINTDEFAULT0; SELECTCOUNT(*)INTOuser_countFROMusers; RETURNuser_count; END// DELIMITER ; -- 調(diào)用函數(shù) SELECTGetUserCount();
觸發(fā)器
創(chuàng)建觸發(fā)器
-- BEFORE INSERT觸發(fā)器 DELIMITER// CREATETRIGGERbefore_user_insert BEFOREINSERTONusers FOREACHROW BEGIN SETNEW.created_at=NOW(); SETNEW.updated_at=NOW(); END// DELIMITER ; -- AFTER UPDATE觸發(fā)器 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觸發(fā)器 DELIMITER// CREATETRIGGERbefore_user_delete BEFOREDELETEONusers FOREACHROW BEGIN INSERT INTOdeleted_usersSELECT*FROMusersWHEREid=OLD.id; END// DELIMITER ;
查看和刪除觸發(fā)器
-- 查看觸發(fā)器 SHOWTRIGGERS; -- 刪除觸發(fā)器 DROPTRIGGERbefore_user_insert;
DML數(shù)據(jù)操作語言
DML用于對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行增刪改操作。
INSERT語句
基本插入
-- 插入單條記錄 INSERT INTOusers (username, email, password) VALUES('john_doe','john@example.com','password123'); -- 插入多條記錄 INSERT INTOusers (username, email, password)VALUES ('alice','alice@example.com','pass123'), ('bob','bob@example.com','pass456'), ('charlie','charlie@example.com','pass789'); -- 插入所有字段 INSERT INTOusersVALUES (NULL,'david','david@example.com','pass000', NOW(), NOW());
高級(jí)插入
-- 插入并忽略重復(fù)記錄 INSERTIGNOREINTOusers (username, email, password) VALUES('john_doe','john@example.com','password123'); -- 插入或更新(ON DUPLICATE KEY UPDATE) INSERT INTOusers (username, email, password) VALUES('john_doe','john@example.com','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','john@example.com','new_password');
UPDATE語句
基本更新
-- 更新單條記錄 UPDATEusers SETemail='newemail@example.com', updated_at=NOW() WHEREid=1; -- 更新多條記錄 UPDATEusers SETstatus='inactive' WHERElast_login<'2024-01-01'; -- 更新所有記錄 UPDATE?users?SET?updated_at?=?NOW();
高級(jí)更新
-- 多表更新 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; -- 限制更新記錄數(shù) UPDATEusers SETstatus='processed' WHEREstatus='pending' ORDERBYcreated_at LIMIT100;
DELETE語句
基本刪除
-- 刪除單條記錄 DELETEFROMusersWHEREid=1; -- 刪除多條記錄 DELETEFROMusersWHEREstatus='inactive'; -- 刪除所有記錄 DELETEFROMusers;
高級(jí)刪除
-- 多表刪除 DELETEu FROMusers u JOINorders oONu.id=o.user_id WHEREo.order_date<'2020-01-01'; -- 限制刪除記錄數(shù) DELETEFROM?users? WHERE?status?='spam' ORDERBY?created_at? LIMIT?1000; -- 安全刪除(使用事務(wù)) START?TRANSACTION; DELETEFROM?users?WHERE?id?=1; -- 檢查結(jié)果 SELECT?ROW_COUNT(); COMMIT;?-- 或 ROLLBACK;
DQL數(shù)據(jù)查詢語言
DQL是SQL中最復(fù)雜也是最常用的部分,用于從數(shù)據(jù)庫中檢索數(shù)據(jù)。
基本SELECT語句
簡(jiǎn)單查詢
-- 查詢所有字段 SELECT*FROMusers; -- 查詢指定字段 SELECTid, username, emailFROMusers; -- 使用別名 SELECT idASuser_id, usernameASlogin_name, emailASemail_address FROMusers; -- 去重查詢 SELECTDISTINCTstatusFROMusers; -- 限制結(jié)果數(shù)量 SELECT*FROMusers LIMIT10; SELECT*FROMusers LIMIT10,20;-- 跳過10條,取20條
WHERE條件查詢
基本條件
-- 等值查詢 SELECT*FROMusersWHEREstatus='active'; -- 不等值查詢 SELECT*FROMusersWHEREstatus!='inactive'; SELECT*FROMusersWHEREstatus<>'inactive'; -- 數(shù)值比較 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);
復(fù)合條件
-- 邏輯AND SELECT*FROMusers WHEREstatus='active'ANDage>25; -- 邏輯OR SELECT*FROMusers WHEREstatus='active'ORstatus='pending'; -- 復(fù)雜條件組合 SELECT*FROMusers WHERE(status='active'ORstatus='pending') ANDageBETWEEN18AND65 ANDemailLIKE'%@gmail.com';
排序和分組
ORDER BY排序
-- 升序排序 SELECT*FROMusersORDERBYcreated_atASC; -- 降序排序 SELECT*FROMusersORDERBYcreated_atDESC; -- 多字段排序 SELECT*FROMusers ORDERBYstatusASC, created_atDESC; -- 使用表達(dá)式排序 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;
聚合函數(shù)
常用聚合函數(shù)
-- 計(jì)數(shù) 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;
窗口函數(shù)(MySQL 8.0+)
-- 行號(hào) 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; -- 累計(jì)求和 SELECT order_date, amount, SUM(amount)OVER(ORDERBYorder_date)asrunning_total FROMorders; -- 移動(dòng)平均 SELECT order_date, amount, AVG(amount)OVER(ORDERBYorder_dateROWSBETWEEN2PRECEDINGANDCURRENTROW)asma3 FROMorders;
表連接
內(nèi)連接(INNER JOIN)
-- 基本內(nèi)連接 SELECTu.username, p.title FROMusers u INNERJOINposts pONu.id=p.user_id; -- 多表內(nèi)連接 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; -- 查找員工及其直接上級(jí) SELECT e.nameasemployee, m.nameasmanager FROMemployees e LEFTJOINemployees mONe.manager_id=m.id;
子查詢
標(biāo)量子查詢
-- 查詢年齡大于平均年齡的用戶 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 );
表子查詢
-- 使用子查詢作為臨時(shí)表 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;
相關(guān)子查詢
-- 查詢每個(gè)用戶的最新訂單 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' );
高級(jí)查詢技巧
公用表表達(dá)式(CTE)- MySQL 8.0+
-- 基本CTE WITHactive_usersAS( SELECTid, username, email FROMusers WHEREstatus='active' ) SELECT*FROMactive_usersWHEREemailLIKE'%@gmail.com'; -- 遞歸CTE WITHRECURSIVEemployee_hierarchyAS( -- 基礎(chǔ)查詢:頂級(jí)員工 SELECTid, name, manager_id,0aslevel FROMemployees WHEREmanager_idISNULL UNIONALL -- 遞歸查詢:下級(jí)員工 SELECTe.id, e.name, e.manager_id, eh.level+1 FROMemployees e JOINemployee_hierarchy ehONe.manager_id=eh.id ) SELECT*FROMemployee_hierarchyORDERBYlevel, name;
案例表達(dá)式
-- CASE WHEN SELECT username, age, CASE WHENage<18THEN'未成年' ? ? ? ??WHEN?age?BETWEEN18AND65THEN'成年' ? ? ? ??ELSE'老年' ? ??ENDas?age_group FROM?users; -- 簡(jiǎn)單CASE SELECT ? ? username, ? ? status, ? ??CASE?status ? ? ? ??WHEN'active'THEN'活躍' ? ? ? ??WHEN'inactive'THEN'不活躍' ? ? ? ??ELSE'未知' ? ??ENDas?status_desc FROM?users;
DCL數(shù)據(jù)控制語言
DCL用于控制數(shù)據(jù)庫的訪問權(quán)限和安全性。
用戶管理
創(chuàng)建用戶
-- 創(chuàng)建用戶 CREATEUSER'newuser'@'localhost'IDENTIFIEDBY'password123'; -- 創(chuàng)建用戶并指定主機(jī) CREATEUSER'webuser'@'192.168.1.%'IDENTIFIEDBY'webpass'; CREATEUSER'appuser'@'%'IDENTIFIEDBY'apppass'; -- 創(chuàng)建用戶時(shí)指定密碼策略 CREATEUSER'secureuser'@'localhost' IDENTIFIEDBY'SecurePass123!' PASSWORD EXPIREINTERVAL90DAY;
修改用戶
-- 修改用戶密碼 ALTERUSER'newuser'@'localhost'IDENTIFIEDBY'newpassword'; -- 修改當(dāng)前用戶密碼 ALTERUSERUSER() IDENTIFIEDBY'newpassword'; -- 設(shè)置密碼過期 ALTERUSER'newuser'@'localhost'PASSWORD EXPIRE; -- 鎖定用戶 ALTERUSER'newuser'@'localhost'ACCOUNT LOCK; -- 解鎖用戶 ALTERUSER'newuser'@'localhost'ACCOUNT UNLOCK;
刪除用戶
-- 刪除用戶 DROPUSER'newuser'@'localhost'; -- 刪除多個(gè)用戶 DROPUSER'user1'@'localhost','user2'@'localhost';
查看用戶
-- 查看所有用戶 SELECTuser, hostFROMmysql.user; -- 查看當(dāng)前用戶 SELECTUSER(),CURRENT_USER(); -- 查看用戶權(quán)限 SHOWGRANTSFOR'newuser'@'localhost'; SHOWGRANTSFORCURRENT_USER();
權(quán)限管理
授予權(quán)限
-- 授予數(shù)據(jù)庫所有權(quán)限 GRANTALLPRIVILEGESONmydb.*TO'newuser'@'localhost'; -- 授予特定表的權(quán)限 GRANTSELECT,INSERT,UPDATEONmydb.usersTO'newuser'@'localhost'; -- 授予特定列的權(quán)限 GRANTSELECT(id, username),UPDATE(email)ONmydb.usersTO'newuser'@'localhost'; -- 授予存儲(chǔ)過程權(quán)限 GRANTEXECUTEONPROCEDUREmydb.GetUserByIdTO'newuser'@'localhost'; -- 授予全局權(quán)限 GRANTREPLICATION SLAVEON*.*TO'repl_user'@'%'; -- 授予權(quán)限并允許授權(quán)給其他用戶 GRANTSELECTONmydb.*TO'newuser'@'localhost'WITHGRANTOPTION;
權(quán)限類型詳解
-- 數(shù)據(jù)操作權(quán)限 GRANTSELECTONmydb.*TO'readonly'@'localhost'; GRANTINSERTONmydb.*TO'insert_user'@'localhost'; GRANTUPDATEONmydb.*TO'update_user'@'localhost'; GRANTDELETEONmydb.*TO'delete_user'@'localhost'; -- 結(jié)構(gòu)操作權(quán)限 GRANTCREATEONmydb.*TO'dev_user'@'localhost'; GRANTALTERONmydb.*TO'admin_user'@'localhost'; GRANTDROPONmydb.*TO'admin_user'@'localhost'; GRANTINDEXONmydb.*TO'dba_user'@'localhost'; -- 管理權(quán)限 GRANTPROCESSON*.*TO'monitor_user'@'localhost'; GRANTRELOADON*.*TO'backup_user'@'localhost'; GRANTREPLICATION CLIENTON*.*TO'repl_monitor'@'localhost';
回收權(quán)限
-- 回收特定權(quán)限 REVOKESELECTONmydb.usersFROM'newuser'@'localhost'; -- 回收所有權(quán)限 REVOKEALLPRIVILEGESONmydb.*FROM'newuser'@'localhost'; -- 回收授權(quán)權(quán)限 REVOKEGRANTOPTIONONmydb.*FROM'newuser'@'localhost';
刷新權(quán)限
-- 刷新權(quán)限緩存 FLUSH PRIVILEGES;
角色管理(MySQL 8.0+)
創(chuàng)建角色
-- 創(chuàng)建角色 CREATEROLE'app_developer','app_read','app_write'; -- 授予角色權(quán)限 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'; -- 設(shè)置默認(rèn)角色 SETDEFAULTROLE'app_developer'TO'dev_user'@'localhost';
角色繼承
-- 創(chuàng)建角色層次結(jié)構(gòu) CREATEROLE'base_role','advanced_role','admin_role'; -- 基礎(chǔ)角色權(quán)限 GRANTSELECTONmydb.*TO'base_role'; -- 高級(jí)角色繼承基礎(chǔ)角色 GRANT'base_role'TO'advanced_role'; GRANTINSERT,UPDATEONmydb.*TO'advanced_role'; -- 管理員角色繼承高級(jí)角色 GRANT'advanced_role'TO'admin_role'; GRANTDELETE,CREATE,ALTERONmydb.*TO'admin_role';
安全配置
密碼策略
-- 查看密碼策略 SHOWVARIABLESLIKE'validate_password%'; -- 設(shè)置密碼策略 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;
連接限制
-- 創(chuàng)建用戶時(shí)設(shè)置連接限制 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';
性能優(yōu)化與運(yùn)維實(shí)踐
查詢優(yōu)化
執(zhí)行計(jì)劃分析
-- 基本執(zhí)行計(jì)劃 EXPLAINSELECT*FROMusersWHEREage>25; -- 詳細(xì)執(zhí)行計(jì)劃 EXPLAIN FORMAT=JSONSELECT*FROMusersWHEREage>25; -- 查看實(shí)際執(zhí)行統(tǒng)計(jì) EXPLAIN ANALYZESELECT*FROMusersWHEREage>25;
索引優(yōu)化策略
-- 創(chuàng)建合適的索引 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';
監(jiān)控與維護(hù)
性能監(jiān)控
-- 查看慢查詢 SHOWVARIABLESLIKE'slow_query_log%'; SHOWSTATUSLIKE'Slow_queries'; -- 查看連接狀態(tài) SHOWSTATUSLIKE'Connections'; SHOWSTATUSLIKE'Threads_%'; -- 查看緩存命中率 SHOWSTATUSLIKE'Key_read%'; SHOWSTATUSLIKE'Innodb_buffer_pool_read%'; -- 查看鎖等待 SHOWSTATUSLIKE'Innodb_row_lock_%';
表維護(hù)
-- 分析表 ANALYZETABLEusers; -- 優(yōu)化表 OPTIMIZETABLEusers; -- 檢查表 CHECKTABLEusers; -- 修復(fù)表 REPAIRTABLEusers;
備份與恢復(fù)
邏輯備份
# 備份單個(gè)數(shù)據(jù)庫 mysqldump -u root -p mydb > mydb_backup.sql # 備份所有數(shù)據(jù)庫 mysqldump -u root -p --all-databases > all_databases_backup.sql # 備份表結(jié)構(gòu) mysqldump -u root -p --no-data mydb > mydb_structure.sql # 恢復(fù)數(shù)據(jù)庫 mysql -u root -p mydb < mydb_backup.sql
物理備份
-- 創(chuàng)建備份目錄 SETGLOBALlocal_infile=1; -- 導(dǎo)出數(shù)據(jù)到文件 SELECT*INTOOUTFILE'/tmp/users_backup.csv' FIELDS TERMINATEDBY',' LINES TERMINATEDBY' ' FROMusers; -- 從文件導(dǎo)入數(shù)據(jù) LOAD DATA INFILE'/tmp/users_backup.csv' INTOTABLEusers FIELDS TERMINATEDBY',' LINES TERMINATEDBY' ';
主從復(fù)制配置
主庫配置
-- 啟用二進(jìn)制日志 SETGLOBALlog_bin='mysql-bin'; -- 創(chuàng)建復(fù)制用戶 CREATEUSER'repl'@'slave_host'IDENTIFIEDBY'repl_password'; GRANTREPLICATION SLAVEON*.*TO'repl'@'slave_host'; -- 查看主庫狀態(tài) 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; -- 啟動(dòng)復(fù)制 STARTSLAVE; -- 查看從庫狀態(tài) SHOWSLAVE STATUSG;
總結(jié)
本文深入探討了MySQL的架構(gòu)組成和SQL語言體系,涵蓋了從基礎(chǔ)概念到高級(jí)應(yīng)用的各個(gè)方面。作為運(yùn)維工程師,掌握這些知識(shí)對(duì)于數(shù)據(jù)庫的日常管理、性能優(yōu)化和故障排除至關(guān)重要。
關(guān)鍵要點(diǎn)回顧
1.MySQL架構(gòu)理解:分層架構(gòu)設(shè)計(jì)使得MySQL具有良好的擴(kuò)展性和靈活性
2.存儲(chǔ)引擎選擇:InnoDB適合事務(wù)處理,MyISAM適合讀密集型應(yīng)用
3.內(nèi)存管理:合理配置緩沖池大小對(duì)性能影響巨大
4.SQL語言掌握:熟練使用DDL、DML、DQL、DCL是基本技能
5.性能優(yōu)化:索引設(shè)計(jì)、查詢優(yōu)化、監(jiān)控調(diào)優(yōu)是持續(xù)過程
6.安全管理:用戶權(quán)限控制、數(shù)據(jù)備份恢復(fù)是安全保障
運(yùn)維最佳實(shí)踐
1.定期監(jiān)控:建立完善的監(jiān)控體系,及時(shí)發(fā)現(xiàn)問題
2.備份策略:制定并執(zhí)行定期備份計(jì)劃,確保數(shù)據(jù)安全
3.性能調(diào)優(yōu):持續(xù)優(yōu)化查詢語句和索引設(shè)計(jì)
4.安全加固:定期審核用戶權(quán)限,加強(qiáng)訪問控制
5.容量規(guī)劃:根據(jù)業(yè)務(wù)增長(zhǎng)預(yù)估資源需求
6.故障預(yù)案:制定詳細(xì)的故障處理流程和恢復(fù)方案
通過深入理解MySQL的內(nèi)部機(jī)制和熟練掌握SQL語言,運(yùn)維工程師能夠更好地管理和優(yōu)化數(shù)據(jù)庫系統(tǒng),確保業(yè)務(wù)的穩(wěn)定運(yùn)行和數(shù)據(jù)的安全可靠。隨著業(yè)務(wù)的發(fā)展和技術(shù)的進(jìn)步,持續(xù)學(xué)習(xí)和實(shí)踐是每個(gè)運(yùn)維工程師必須具備的素質(zhì)。
-
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3927瀏覽量
66229 -
管理系統(tǒng)
+關(guān)注
關(guān)注
1文章
2767瀏覽量
37052 -
MySQL
+關(guān)注
關(guān)注
1文章
860瀏覽量
27940
原文標(biāo)題:一文徹底搞懂MySQL組成結(jié)構(gòu)及SQL高效查詢技巧(附大廠經(jīng)驗(yàn))
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
結(jié)構(gòu)化布線系統(tǒng)有哪些難題
TrustZone結(jié)構(gòu)化消息是什么?
Deeplearningai結(jié)構(gòu)化機(jī)器學(xué)習(xí)項(xiàng)目
結(jié)構(gòu)化匯編語言的監(jiān)控程序設(shè)計(jì)思想
結(jié)構(gòu)化設(shè)計(jì)分為哪幾部分?結(jié)構(gòu)化設(shè)計(jì)的要求有哪些
結(jié)構(gòu)化布線的綜合說明
什么叫結(jié)構(gòu)化的算法_算法和結(jié)構(gòu)化數(shù)據(jù)初識(shí)

結(jié)構(gòu)化布線系統(tǒng)的四點(diǎn)注意事項(xiàng)
Visual FoxPro程序設(shè)計(jì)教程之結(jié)構(gòu)化查詢語言SQL的詳細(xì)資料合集

結(jié)構(gòu)化查詢語言SQL的使用詳解

結(jié)構(gòu)化文本語言ST編程的學(xué)習(xí)課件

C語言程序設(shè)計(jì)第四講結(jié)構(gòu)化程序設(shè)計(jì)之選擇
西門子博途S7-SCL結(jié)構(gòu)化控制語言編程

評(píng)論