MySQL 作為全球最流行的開源關係型數據庫,掌握其核心操作與最佳實踐是每位開發者與 DBA 的必修課。本文系統整理了 MySQL 日常開發、運維中高頻使用的核心知識點,涵蓋基礎查詢、數據庫管理、字符集編碼、數據類型選擇、建表規範、查詢優化、備份恢復、鎖機制以及用戶權限管理等關鍵領域,旨在為你提供一份可速查、可實戰的「MySQL 速查手冊」。
快速掌握當前數據庫運行狀態是排查問題的第一步。
1. 當前會話信息查詢
-- 查看當前默認數據庫 SELECT DATABASE(); -- 顯示當前時間、登錄用戶、服務器版本 SELECT NOW(), USER(), VERSION();
2. 表結構與數據復制
-- 僅復制表結構(不含數據、索引、約束) CREATE TABLE new_table LIKE old_table; -- 復制表結構及全部數據 CREATE TABLE new_table AS SELECT * FROM old_table;
字符集問題是 MySQL 亂碼的核心成因,必須建立清晰的認知體系。
-- 查看所有字符集相關變量 SHOW VARIABLES LIKE 'character_set_%'; -- 臨時修改當前會話編碼 SET NAMES utf8mb4;
核心原則:「足夠用就行,越小越好,盡量避免 NULL」。
| 類型 | 存儲字節 | 有符號範圍 | 無符號範圍 | 典型場景 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 布爾值、狀態碼、極小整數 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 較小範圍整數 |
| MEDIUMINT | 3 | -838萬 ~ 838萬 | 0 ~ 1,677萬 | 中等整數 |
| INT / INTEGER | 4 | -21億 ~ 21億 | 0 ~ 42億 | 通用主鍵、外鍵、計數器 |
| BIGINT | 8 | -922京 ~ 922京 | 0 ~ 1844京 | 極大整數、分布式 ID、時間戳毫秒 |
關鍵細節:
| 類型 | 最大長度 | 存儲特點 | 適用場景 |
|---|---|---|---|
| CHAR(N) | 255 字符 | 定長,不足右補空格,讀取快但浪費空間 | MD5、UUID、手機號、身份證等固定長度字符 |
| VARCHAR(N) | 65,535 字符 (受行大小 65,535 字節限制) | 變長,需 1-2 字節存長度,節省空間 | 不定長文本:姓名、地址、郵箱、標題等 |
編碼對 VARCHAR 實際上限的影響(以單表單列為例):
遵循範式理論,平衡規範化與性能。
工程落地建議:
| 維度 | WHERE | HAVING |
|---|---|---|
| 執行時機 | 分組前,過濾原始行 | 分組後,過濾聚合結果 |
| 可用列 | 表中實際存在的列 | SELECT 列表中的列/別名/聚合函數 |
| 聚合函數 | 不可用 | 可用(常配合 GROUP BY) |
| 列別名 | 不可用 | 可用 |
最佳實踐:能用 WHERE 解決的絕不用 HAVING,減少中間結果集大小。
採用 `mysqldump` 邏輯備份,支援全量、增量、單表、多表靈活導出。
# 1. 導出單表 mysqldump -u root -p db_name table_name > /backup/table_name.sql # 2. 導出多表 mysqldump -u root -p db_name t1 t2 t3 > /backup/multi_tables.sql # 3. 導出整庫(含建庫語句,利於異機恢復) mysqldump -u root -p -B db_name > /backup/full_db.sql # 4. 條件導出(如按時間分片) mysqldump -u root -p db_name table_name --where="create_time > '2024-01-01'" > /backup/incr.sql
# 方式一:登錄 MySQL 後執行(適合小文件) SOURCE /backup/full_db.sql; # 方式二:命令行直連(適合大文件、自動化腳本) mysql -u root -p db_name < /backup/full_db.sql
-- 顯式加表鎖(慎用,會阻塞所有寫操作) LOCK TABLES orders WRITE, users READ; -- 釋放當前會話所有鎖 UNLOCK TABLES;
MySQL 採用「用戶@宿主機」唯一標識,權限分級:全局 > 數據庫 > 表 > 列。
-- 1. 創建用戶(建議指定宿主機,避免 '%' 風險) CREATE USER 'app_user'@'10.0.%.%' IDENTIFIED BY 'StrongP@ssw0rd!'; -- 2. 授權(最小權限原則) GRANT SELECT, INSERT, UPDATE ON `biz_db`.* TO 'app_user'@'10.0.%.%'; -- 管理員授權(含 GRANT OPTION) GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.0.0.1' WITH GRANT OPTION; -- 3. 查看權限 SHOW GRANTS FOR 'app_user'@'10.0.%.%'; -- 4. 回收權限 REVOKE INSERT ON `biz_db`.* FROM 'app_user'@'10.0.%.%'; REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'admin'@'10.0.0.1'; -- 5. 修改密碼(5.7+ 推薦 ALTER USER) ALTER USER 'app_user'@'10.0.%.%' IDENTIFIED BY 'NewStr0ngP@ss!'; -- 6. 刪除用戶 DROP USER 'app_user'@'10.0.%.%'; -- 7. 刷新權限生效(修改授權表後必執行) FLUSH PRIVILEGES;
| 層級 | 作用範圍 | 系統表 | 典型授權語法 |
|---|---|---|---|
| 全局 | 所有庫、所有表 | mysql.user | GRANT ALL ON *.* |
| 數據庫 | 指定庫下所有表 | mysql.db | GRANT ALL ON db_name.* |
| 表 | 指定表所有列 | mysql.tables_priv | GRANT ALL ON db.tbl |
| 列 | 指定表單列 | mysql.columns_priv | GRANT SELECT(col) ON db.tbl |
本文匯總的 MySQL 精粹知識點,涵蓋了從基礎操作到進階管理的核心技能樹。建議開發者將其作為案頭速查手冊,在實戰中反覆練習、總結體會,方能內化為解決生產問題的硬核實力。