MySQL教程:全面理論與實踐指南(全)

一、MySQL簡介與理論基礎
MySQL是世界上最流行的開源關係型資料庫管理系統之一,廣泛應用於網站、應用程式和企業級系統。它採用客戶端/伺服器架構,支援多使用者環境,並基於SQL(結構化查詢語言)標準。
關係型資料庫核心概念
-
1. 關係模型:資料以表格(二維表)形式儲存,表之間透過關係連線 -
2. ACID特性: -
• 原子性(Atomicity):事務中的操作要麼全部完成,要麼全部不完成 -
• 一致性(Consistency):事務執行前後,資料庫從一個一致狀態變到另一個一致狀態 -
• 隔離性(Isolation):併發執行的事務之間不會互相影響 -
• 永續性(Durability):事務一旦提交,其結果將永久儲存
MySQL架構
MySQL採用多層架構設計:
-
1. 連線層:處理客戶端連線請求 -
2. 服務層:包括查詢解析、最佳化和快取 -
3. 儲存引擎層:負責資料的儲存和提取 -
4. 檔案系統層:將資料持久化到磁碟
儲存引擎
MySQL支援多種儲存引擎,每種都有特定的特性和用途:
-
• InnoDB:預設儲存引擎,支援事務、外部索引鍵和行級鎖 `CREATE TABLE example (id INT) ENGINE=InnoDB;`
-
• MyISAM:適合讀密集型應用,支援全文索引 `CREATE TABLE logs (id INT, message TEXT) ENGINE=MyISAM;`
-
• Memory:將資料儲存在記憶體中,速度極快但不持久 `CREATE TABLE temp_data (id INT) ENGINE=MEMORY;`
-
• Archive:適合儲存和檢索大量很少被查詢的歷史資料 `CREATE TABLE old_logs (id INT, log_text TEXT) ENGINE=ARCHIVE;`
MySQL資料型別
-
1. 數值型別: -
• INT:整數型別,4位元組 -
• TINYINT:小整數,1位元組 -
• BIGINT:大整數,8位元組 -
• FLOAT/DOUBLE:浮點數 -
• DECIMAL:精確小數 -
2. 字串型別: -
• CHAR(n):固定長度字串 -
• VARCHAR(n):可變長度字串 -
• TEXT:長文字 -
3. 日期和時間型別: -
• DATE:日期,格式'YYYY-MM-DD' -
• TIME:時間,格式'HH:MM:SS' -
• DATETIME:日期和時間,格式'YYYY-MM-DD HH:MM:SS' -
• TIMESTAMP:時間戳 -
4. 其他型別: -
• ENUM:列舉型別 -
• SET:集合型別 -
• BLOB:二進位制大物件
二、資料庫和表的基本操作
資料庫操作語法詳解
-- 建立資料庫CREATE DATABASE [IF NOTEXISTS] mydb [CHARACTER SET charset_name] [COLLATE collation_name];-- 檢視所有資料庫SHOW DATABASES;-- 使用資料庫USE mydb;-- 刪除資料庫DROP DATABASE [IF EXISTS] mydb;
表操作語法詳解
-- 建立表CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, -- 主鍵,自動遞增 name VARCHAR(50) NOT NULL, -- NOT NULL約束 age INTCHECK (age >0), -- CHECK約束 gender ENUM('男', '女'), -- 列舉型別 class VARCHAR(20), score FLOATDEFAULT0, -- 預設值 created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP, -- 自動記錄建立時間 INDEX idx_class (class) -- 索引) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 查看錶結構DESCRIBE students;-- 或SHOW COLUMNS FROM students;-- 修改表結構ALTER TABLE students ADDCOLUMN email VARCHAR(100);ALTER TABLE students MODIFY COLUMN name VARCHAR(100);ALTER TABLE students DROPCOLUMN email;-- 刪除表DROPTABLE [IF EXISTS] students;
三、增:INSERT 插入資料
插入語法詳解
基本語法:
INSERT INTO table_name [(column1, column2, ...)]VALUES (value1, value2, ...)[, (value1, value2, ...), ...];
插入單條資料
INSERT INTO students (name, age, gender, class, score) VALUES ('張三', 20, '男', '計算機科學1班', 89.5);
插入多條資料
INSERT INTO students (name, age, gender, class, score) VALUES('李四', 19, '男', '計算機科學1班', 76.0),('王五', 21, '男', '計算機科學2班', 92.5),('趙六', 20, '女', '計算機科學2班', 85.0),('錢七', 22, '女', '計算機科學1班', 79.5);
INSERT的高階用法
-- 插入或更新(如果主鍵存在則更新)INSERT INTO students (id, name, score)VALUES (1, '張三', 95)ON DUPLICATE KEY UPDATE score =95;-- 從其他表插入資料INSERT INTO students_backupSELECT*FROM students WHERE class ='計算機科學1班';-- 忽略錯誤繼續執行INSERT IGNORE INTO students (id, name, age)VALUES (1, '張三', 20);
實際應用場景
當新學生入學時,需要將學生資訊錄入系統:
-- 新學期開始,新增一批新生INSERT INTO students (name, age, gender, class, score) VALUES('劉備', 18, '男', '計算機1班', NULL), -- 新生還沒有成績('關羽', 19, '男', '計算機1班', NULL),('張飛', 18, '男', '計算機1班', NULL);
四、查:SELECT 查詢資料
SELECT語法詳解
基本語法:
SELECT [DISTINCT] column1, column2, ...FROM table_name[JOIN table_name2 ON join_condition][WHEREcondition][GROUPBYcolumn(s)][HAVING group_condition][ORDERBYcolumn(s) [ASC|DESC]][LIMIT offset, row_count];
查詢所有記錄
`SELECT*FROM students;`
查詢特定列
`SELECT name, age, score FROM students;`
條件查詢與WHERE子句詳解
-- 查詢計算機科學1班的學生SELECT*FROM students WHERE class ='計算機科學1班';-- 查詢成績大於80的學生SELECT name, score FROM students WHERE score >80;-- 查詢年齡在19到21歲之間的學生SELECT*FROM students WHERE age BETWEEN19AND21;-- 複合條件:AND, OR, NOTSELECT*FROM students WHERE (class ='計算機科學1班'OR class ='計算機科學2班')AND score >=80ANDNOT gender ='女';-- NULL值處理SELECT*FROM students WHERE score ISNULL;SELECT*FROM students WHERE score ISNOT NULL;
排序與ORDER BY子句
-- 按成績降序排列SELECT*FROM students ORDERBY score DESC;-- 先按班級升序,再按成績降序SELECT*FROM students ORDERBY class ASC, score DESC;-- 按欄位位置排序(不推薦,但需瞭解)SELECT name, age, score FROM students ORDERBY3DESC; -- 按第3列(score)排序
分組和聚合函式
-- 計算每個班級的平均分SELECT class, AVG(score) as avg_score FROM students GROUPBY class;-- 查詢每個班級的最高分和最低分SELECT class, MAX(score) as highest_score, MIN(score) as lowest_score,COUNT(*) as student_count,SUM(score) as total_score, STDDEV(score) as score_deviation -- 標準差FROM students WHERE score ISNOT NULLGROUPBY class;-- HAVING子句(對分組結果進行篩選)SELECT class, AVG(score) as avg_score FROM students GROUPBY classHAVING avg_score >80;
限制結果數量
-- 查詢前3名學生SELECT*FROM students ORDERBY score DESC LIMIT 3;-- 分頁查詢:每頁5條,查詢第2頁SELECT*FROM students LIMIT 5, 5; -- 偏移量5,返回5條-- 或使用更現代的語法SELECT*FROM students LIMIT 5OFFSET5;
模糊查詢與LIKE運算子
-- 查詢名字中包含"張"的學生SELECT*FROM students WHERE name LIKE'%張%';-- 查詢以"計算機"開頭的班級SELECTDISTINCT class FROM students WHERE class LIKE'計算機%';-- 萬用字元說明-- %:匹配任意數量的字元-- _:匹配單個字元SELECT*FROM students WHERE name LIKE'張_'; -- 匹配"張"後跟一個字元的名字
正則表示式查詢
-- 查詢名字中包含數字的學生SELECT*FROM students WHERE name REGEXP '[0-9]';-- 查詢名字以"張"或"王"開頭的學生SELECT*FROM students WHERE name REGEXP '^[張王]';
實際應用場景
期末考試後,教師需要統計班級情況:
-- 查詢每個班級的及格率SELECT class,COUNT(*) as total_students,SUM(CASEWHEN score >=60THEN1ELSE0END) as passed_students, ROUND(SUM(CASEWHEN score >=60THEN1ELSE0END) /COUNT(*) *100, 2) as pass_rateFROM studentsWHERE score ISNOT NULLGROUPBY class;
五、改:UPDATE 更新資料
UPDATE語法詳解
基本語法:
UPDATE table_nameSET column1 = value1, column2 = value2, ...[WHEREcondition][ORDERBY ...][LIMIT row_count];
更新單個記錄
-- 更新張三的成績UPDATE students SET score =92.0WHERE name ='張三';
更新多個欄位
-- 李四轉班並更新資訊UPDATE students SET class ='計算機科學2班', age =20WHERE name ='李四';
條件更新與表示式
-- 給所有90分以上的學生加5分獎勵(但不超過100分)UPDATE students SET score = LEAST(score +5, 100) WHERE score >90;-- 所有學生年齡增加1歲UPDATE students SET age = age +1;-- 使用CASE表示式進行條件更新UPDATE studentsSET score =CASEWHEN score <60THEN score +5-- 不及格加5分WHEN score >=60AND score <90THEN score +3-- 良好加3分ELSE score -- 優秀不變END;
多表更新
-- 基於另一個表的資料更新當前表UPDATE students sJOIN student_extra_info sei ON s.id = sei.student_idSET s.email = sei.email, s.phone = sei.phoneWHERE sei.update_flag =1;
實際應用場景
期中考試後,某些學生參加了補考,需要更新成績:
-- 批次更新補考成績UPDATE studentsSET score =CASEWHEN name ='李四'THEN82.5WHEN name ='錢七'THEN88.0ELSE scoreENDWHERE name IN ('李四', '錢七');
六、刪:DELETE 刪除資料
DELETE語法詳解
基本語法:
DELETEFROM table_name[WHEREcondition][ORDERBY ...][LIMIT row_count];
刪除特定記錄
-- 刪除指定學生DELETEFROM students WHERE name ='趙六';
條件刪除
-- 刪除成績不及格的學生DELETEFROM students WHERE score <60;
限制刪除數量
-- 刪除成績最低的3名學生DELETEFROM studentsORDERBY score ASCLIMIT 3;
多表刪除
-- 刪除已經在畢業生表中的學生DELETE s FROM students sJOIN graduated_students g ON s.id = g.student_id;
清空表
-- 刪除表中所有資料(逐行刪除,可回滾)DELETEFROM students;-- 或者(直接刪除表並重建,效率更高,不可回滾)TRUNCATETABLE students;
DELETE與TRUNCATE的區別
-
1. 事務支援:DELETE支援事務回滾,TRUNCATE不支援 -
2. 速度:TRUNCATE通常更快 -
3. 自增值:TRUNCATE會重置AUTO_INCREMENT計數器 -
4. 觸發器:DELETE會觸發DELETE觸發器,TRUNCATE不會
實際應用場景
學期結束,需要清理臨時學生資料:
-- 刪除已經畢業的學生DELETEFROM students WHERE id IN (SELECT id FROM graduated_students);-- 假設要刪除舊學期的資料並保留新學期資料-- 建立備份CREATE TABLE students_new_semester ASSELECT*FROM students WHERE entry_year =2025;-- 清空原表TRUNCATETABLE students;-- 將新資料插回原表INSERT INTO students SELECT*FROM students_new_semester;-- 刪除臨時表DROPTABLE students_new_semester;
七、高階查詢技巧
連線查詢詳解
MySQL支援多種連線型別:
-
• INNER JOIN(內連線):返回兩表中匹配的行 -
• LEFT JOIN(左連線):返回左表所有行和右表匹配的行 -
• RIGHT JOIN(右連線):返回右表所有行和左表匹配的行 -
• CROSS JOIN(交叉連線):返回兩表的笛卡爾積
假設我們有一個課程表:
CREATE TABLE courses ( course_id INT AUTO_INCREMENT PRIMARY KEY, course_name VARCHAR(50) NOT NULL, teacher VARCHAR(30), credits INT);CREATE TABLE student_courses ( id INT AUTO_INCREMENT PRIMARY KEY, student_id INT, course_id INT,FOREIGN KEY (student_id) REFERENCES students(id),FOREIGN KEY (course_id) REFERENCES courses(course_id));-- 插入一些資料INSERT INTO courses (course_name, teacher, credits) VALUES('資料庫原理', '陳教授', 3),('計算機網路', '王教授', 4),('作業系統', '李教授', 4);INSERT INTO student_courses (student_id, course_id) VALUES(1, 1), (1, 2), (2, 1), (3, 3), (4, 2), (5, 3);
連線查詢示例:
-- 內連線:查詢學生及其選修的課程SELECT s.name, c.course_name, c.teacherFROM students sJOIN student_courses sc ON s.id = sc.student_idJOIN courses c ON sc.course_id = c.course_idORDERBY s.name;-- 左連線:查詢所有學生,包括未選課的SELECT s.name, IFNULL(c.course_name, '未選課') as courseFROM students sLEFTJOIN student_courses sc ON s.id = sc.student_idLEFTJOIN courses c ON sc.course_id = c.course_idORDERBY s.name;-- 右連線:查詢所有課程,包括無人選修的SELECT c.course_name, IFNULL(s.name, '無人選修') as studentFROM student_courses scRIGHTJOIN courses c ON sc.course_id = c.course_idLEFTJOIN students s ON sc.student_id = s.idORDERBY c.course_name;-- 自連線:查詢同班同學SELECT s1.name, s2.name as classmateFROM students s1JOIN students s2 ON s1.class = s2.class AND s1.id != s2.idORDERBY s1.class, s1.name;
子查詢詳解
子查詢是巢狀在另一個查詢中的SELECT語句,可以用在:
-
• SELECT子句 -
• FROM子句 -
• WHERE子句 -
• HAVING子句
-- WHERE子句中的子查詢-- 查詢選修了"資料庫原理"課程的學生SELECT name, age, classFROM studentsWHERE id IN (SELECT student_idFROM student_coursesWHERE course_id = (SELECT course_id FROM courses WHERE course_name ='資料庫原理'));-- FROM子句中的子查詢(派生表)-- 查詢每個班級的平均分,並與學生個人分數比較SELECT s.name, s.score, c.avg_score, s.score - c.avg_score as differenceFROM students sJOIN (SELECT class, AVG(score) as avg_scoreFROM studentsGROUPBY class) c ON s.class = c.classORDERBY difference DESC;-- SELECT子句中的子查詢(標量子查詢)-- 查詢每個學生選修的課程數量SELECT s.name, s.class, (SELECTCOUNT(*) FROM student_courses WHERE student_id = s.id) AS course_countFROM students sORDERBY course_count DESC;-- EXISTS子查詢-- 查詢至少選修了一門課程的學生SELECT name, classFROM students sWHEREEXISTS (SELECT1FROM student_coursesWHERE student_id = s.id);
公用表表達式(CTE)
CTE是一種臨時結果集,可以在單個SQL語句中多次引用:
-- 使用WITH子句定義CTEWITH ClassAvg AS (SELECT class, AVG(score) as avg_scoreFROM studentsGROUPBY class),ClassRanking AS (SELECT s.id, s.name, s.score, s.class,RANK() OVER (PARTITIONBY s.class ORDERBY s.score DESC) as class_rankFROM students s)-- 使用定義的CTESELECT r.name, r.score, r.class, r.class_rank, c.avg_scoreFROM ClassRanking rJOIN ClassAvg c ON r.class = c.classWHERE r.class_rank <=3ORDERBY r.class, r.class_rank;
視窗函式
視窗函式對一組行執行計算,返回每行的值:
-- 計算每個班級中學生的排名SELECT name, score, class,RANK() OVER (PARTITIONBY class ORDERBY score DESC) as class_rank,DENSE_RANK() OVER (PARTITIONBY class ORDERBY score DESC) as dense_rank,ROW_NUMBER() OVER (PARTITIONBY class ORDERBY score DESC) as row_numFROM students;-- 計算累計總和SELECT name, score, class,SUM(score) OVER (PARTITIONBY class ORDERBY score) as running_total,AVG(score) OVER (PARTITIONBY class) as class_avgFROM students;
八、事務控制
事務是一組操作,要麼全部成功,要麼全部失敗。
-- 開始事務START TRANSACTION;-- 執行操作UPDATE students SET score = score +10WHERE id =1;UPDATE courses SET credits = credits +1WHERE course_id =2;-- 如果一切正常,提交事務COMMIT;-- 如果出現問題,回滾事務-- ROLLBACK;
事務隔離級別
MySQL支援四種事務隔離級別:
-- 檢視當前隔離級別SELECT @@TRANSACTION_ISOLATION;-- 設定隔離級別SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-
1. READ UNCOMMITTED:可以讀取未提交的資料(髒讀) -
2. READ COMMITTED:只能讀取已提交的資料 -
3. REPEATABLE READ:MySQL預設級別,確保同一事務中多次讀取結果一致 -
4. SERIALIZABLE:最高級別,完全序列執行
儲存點
在長事務中,可以設定儲存點,回滾到特定位置:
START TRANSACTION;UPDATE students SET score = score +5WHERE id =1;SAVEPOINT point1;UPDATE students SET score = score +10WHERE id =2;-- 如果需要,可以回滾到儲存點ROLLBACKTOSAVEPOINT point1;-- 繼續事務UPDATE students SET score = score +15WHERE id =3;COMMIT;
九、索引與效能最佳化
索引是提高查詢效能的關鍵:
-- 建立索引CREATE INDEX idx_student_name ON students(name);-- 建立複合索引CREATE INDEX idx_class_score ON students(class, score);-- 建立唯一索引CREATEUNIQUE INDEX idx_email ON students(email);-- 查看錶的索引SHOW INDEX FROM students;-- 刪除索引DROP INDEX idx_student_name ON students;
索引型別
-
1. B-Tree索引:預設索引型別,適用於等值查詢和範圍查詢 -
2. 雜湊索引:僅適用於等值比較,Memory引擎支援 -
3. 全文索引:用於全文搜尋 `CREATE FULLTEXT INDEX idx_fulltext ON articles(title, content);`AI寫程式碼sql
-
4. 空間索引:用於地理空間資料 `CREATE SPATIAL INDEX idx_location ON places(location);`AI寫程式碼sql
EXPLAIN分析查詢
-- 分析查詢執行計劃EXPLAIN SELECT*FROM students WHERE class ='計算機科學1班'AND score >80;
查詢最佳化
-- 使用FORCE INDEX強制使用特定索引SELECT*FROM students FORCE INDEX (idx_class_score)WHERE class ='計算機科學1班'AND score >80;-- 使用STRAIGHT_JOIN控制連線順序SELECT STRAIGHT_JOIN s.name, c.course_nameFROM students sJOIN student_courses sc ON s.id = sc.student_idJOIN courses c ON sc.course_id = c.course_id;
十、檢視
檢視是基於SQL查詢的虛擬表,可以簡化複雜查詢:
-- 建立檢視CREATEVIEW student_course_view ASSELECT s.id, s.name, s.class, c.course_name, c.teacherFROM students sJOIN student_courses sc ON s.id = sc.student_idJOIN courses c ON sc.course_id = c.course_id;-- 使用檢視SELECT*FROM student_course_view WHERE class ='計算機科學1班';-- 更新檢視(如果基表允許)UPDATE student_course_view SET name ='張三丰'WHERE id =1;-- 刪除檢視DROPVIEW student_course_view;
檢視的優點
-
1. 簡化複雜查詢:將複雜查詢封裝為檢視 -
2. 提高安全性:限制使用者只能訪問檢視中的特定列 -
3. 資料獨立性:應用程式使用檢視,底層表結構變化時不需要修改應用
十一、儲存過程與函式
儲存過程是一組預編譯的SQL語句,可以接受引數並執行復雜操作:
-- 建立儲存過程DELIMITER //CREATEPROCEDURE update_student_score(IN student_id INT, IN new_score FLOAT)BEGINUPDATE students SET score = new_score WHERE id = student_id;-- 條件語句 IF new_score >=90THENINSERT INTO honor_students (student_id, honor_type) VALUES (student_id, '優秀學生');END IF;END//DELIMITER ;-- 呼叫儲存過程CALL update_student_score(1, 95);-- 建立函式DELIMITER //CREATEFUNCTION get_grade(score FLOAT) RETURNSCHAR(1)DETERMINISTICBEGINDECLARE grade CHAR(1); IF score >=90THENSET grade ='A'; ELSEIF score >=80THENSET grade ='B'; ELSEIF score >=70THENSET grade ='C'; ELSEIF score >=60THENSET grade ='D';ELSESET grade ='F';END IF;RETURN grade;END//DELIMITER ;-- 使用函式SELECT name, score, get_grade(score) as grade FROM students;
儲存過程的高階特性
DELIMITER //CREATEPROCEDURE process_new_students(IN class_name VARCHAR(50))BEGIN-- 宣告變數DECLARE done INTDEFAULTFALSE;DECLARE s_id INT;DECLARE s_name VARCHAR(50);-- 宣告遊標DECLARE student_cursor CURSORFORSELECT id, name FROM students WHERE class = class_name AND score ISNULL;-- 宣告異常處理DECLARE CONTINUE HANDLER FORNOT FOUND SET done =TRUE;-- 開始事務START TRANSACTION;-- 開啟遊標OPEN student_cursor;-- 迴圈處理 read_loop: LOOPFETCH student_cursor INTO s_id, s_name; IF done THEN LEAVE read_loop;END IF;-- 為新生建立初始記錄INSERT INTO student_records (student_id, status) VALUES (s_id, 'active');END LOOP;-- 關閉遊標CLOSE student_cursor;-- 提交事務COMMIT;END//DELIMITER ;
十二、觸發器
觸發器是在表上執行特定操作(INSERT、UPDATE、DELETE)時自動執行的特殊儲存過程:
-- 建立觸發器DELIMITER //CREATETRIGGER after_student_updateAFTER UPDATEON studentsFOREACHROWBEGIN-- 記錄成績變化 IF OLD.score != NEW.score THENINSERT INTO score_changes (student_id, old_score, new_score, change_date)VALUES (NEW.id, OLD.score, NEW.score, NOW());END IF;END//DELIMITER ;-- 檢視觸發器SHOW TRIGGERS;-- 刪除觸發器DROPTRIGGER after_student_update;
觸發器型別
-
1. BEFORE觸發器:在操作執行前觸發 -
2. AFTER觸發器:在操作執行後觸發 -
3. 行級觸發器:對每一行執行一次(FOR EACH ROW)
十三、使用者管理與許可權控制
MySQL提供了完善的使用者管理和許可權控制系統:
-- 建立使用者CREATEUSER'teacher'@'localhost' IDENTIFIED BY'password123';-- 授予許可權GRANTSELECT, UPDATEON school.students TO'teacher'@'localhost';-- 授予所有許可權GRANTALL PRIVILEGES ON school.*TO'admin'@'localhost';-- 檢視使用者許可權SHOW GRANTS FOR'teacher'@'localhost';-- 撤銷許可權REVOKEUPDATEON school.students FROM'teacher'@'localhost';-- 刪除使用者DROPUSER'teacher'@'localhost';
許可權級別
MySQL的許可權系統分為四個級別:
-
1. 全域性級別:適用於所有資料庫 -
2. 資料庫級別:適用於特定資料庫中的所有物件 -
3. 表級別:適用於特定表 -
4. 列級別:適用於特定列
十四、備份與恢復
資料備份是資料庫管理的關鍵部分:
# 使用mysqldump備份資料庫mysqldump -u root -p school > school_backup.sql# 備份特定表mysqldump -u root -p school students courses > tables_backup.sql# 恢復資料庫mysql -u root -p school < school_backup.sql
邏輯備份與物理備份
-
1. 邏輯備份: -
• 以SQL語句形式儲存資料(如mysqldump) -
• 優點:可跨版本、平臺遷移,可選擇性恢復 -
• 缺點:備份和恢復速度較慢,尤其是大型資料庫 -
2. 物理備份: -
• 直接複製資料檔案(如MySQL Enterprise Backup, Percona XtraBackup) -
• 優點:備份和恢復速度快 -
• 缺點:通常依賴於特定MySQL版本和平臺
備份策略
-
1. 完整備份:備份整個資料庫 # 完整備份mysqldump -u root -p --all-databases > full_backup.sql
-
2. 增量備份:僅備份自上次備份以來的變化 # 使用二進位制日誌進行增量備份mysqlbinlog mysql-bin.000001> incremental_backup.sql
-
3. 差異備份:備份自上次完整備份以來的所有變化
備份選項與引數
# 包含儲存過程和函式mysqldump -u root -p --routines school > school_with_routines.sql# 包含觸發器mysqldump -u root -p --triggers school > school_with_triggers.sql# 包含事件mysqldump -u root -p --events school > school_with_events.sql# 鎖定表以確保一致性mysqldump -u root -p --lock-tables school > school_locked.sql# 使用單個事務進行一致性備份mysqldump -u root -p --single-transaction school > school_consistent.sql
自動備份
使用cron作業自動執行備份:
# 在crontab中新增以下內容,每天凌晨2點執行備份0 2 * * * /usr/bin/mysqldump -u root -p'password' school > /backup/school_$(date +\%Y\%m\%d).sql
備份驗證與恢復測試
定期測試備份的有效性:
# 建立測試資料庫mysql -u root -p -e "CREATE DATABASE school_test;"# 恢復備份到測試資料庫mysql -u root -p school_test < school_backup.sql# 驗證資料mysql -u root -p -e "SELECT COUNT(*) FROM school_test.students;"
十五、分割槽表
分割槽表允許將大表分割成更小的、更易管理的部分:
-- 建立按範圍分割槽的表CREATE TABLE student_scores ( id INTNOT NULL, student_id INT, subject VARCHAR(50), score INT, test_date DATE,PRIMARY KEY (id, test_date))PARTITIONBYRANGE (YEAR(test_date)) (PARTITION p0 VALUES LESS THAN (2020),PARTITION p1 VALUES LESS THAN (2021),PARTITION p2 VALUES LESS THAN (2022),PARTITION p3 VALUES LESS THAN (2023),PARTITION p4 VALUES LESS THAN MAXVALUE);-- 建立按列表分割槽的表CREATE TABLE regional_sales ( id INTNOT NULL, region VARCHAR(50), sales DECIMAL(10,2),PRIMARY KEY (id, region))PARTITIONBY LIST (region) (PARTITION p_east VALUESIN ('東北', '華東'),PARTITION p_south VALUESIN ('華南', '西南'),PARTITION p_north VALUESIN ('華北', '西北'),PARTITION p_central VALUESIN ('華中'));-- 建立按雜湊分割槽的表CREATE TABLE access_logs ( id INTNOT NULL, user_id INT, access_time DATETIME, url VARCHAR(255),PRIMARY KEY (id, user_id))PARTITIONBY HASH (user_id)PARTITIONS 4;
分割槽管理
-- 新增分割槽ALTER TABLE student_scores ADDPARTITION (PARTITION p5 VALUES LESS THAN (2024));-- 刪除分割槽ALTER TABLE student_scores DROPPARTITION p0;-- 重組分割槽ALTER TABLE student_scores REORGANIZE PARTITION p1, p2 INTO (PARTITION p1_2 VALUES LESS THAN (2022));-- 查看錶分割槽資訊SELECT*FROM information_schema.partitions WHERE table_name ='student_scores';
分割槽優勢
-
1. 提高查詢效能:查詢可以只掃描相關分割槽 -
2. 簡化資料管理:可以單獨備份、恢復或最佳化特定分割槽 -
3. 提高可用性:不同分割槽可以儲存在不同磁碟上
十六、複製與高可用
MySQL複製允許資料從一個MySQL資料庫伺服器(主伺服器)複製到一個或多個MySQL資料庫伺服器(從伺服器)。
主從複製配置
主伺服器配置:
# my.cnf 主伺服器配置[mysqld]server-id =1log_bin = mysql-binbinlog_format =ROW
從伺服器配置:
# my.cnf 從伺服器配置[mysqld]server-id =2relay_log = mysql-relay-bin
設定複製:
-- 在主伺服器上建立複製使用者CREATEUSER'repl'@'%' IDENTIFIED BY'password';GRANT REPLICATION SLAVE ON*.*TO'repl'@'%';-- 獲取主伺服器狀態SHOW MASTER STATUS;-- 在從伺服器上配置複製CHANGE MASTER TO MASTER_HOST='master_host_ip', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=123;-- 啟動從伺服器複製START SLAVE;-- 檢查從伺服器狀態SHOW SLAVE STATUS\G
複製型別
-
1. 非同步複製:預設模式,主伺服器不等待從伺服器確認 -
2. 半同步複製:主伺服器等待至少一個從伺服器確認接收事件 -
3. 組複製:多主模式,提供高可用性和自動故障轉移
高可用解決方案
-
1. MySQL Group Replication:內建的高可用解決方案 -
2. MySQL InnoDB Cluster:結合MySQL Shell、Group Replication和MySQL Router -
3. 第三方工具:如Percona XtraDB Cluster、MariaDB Galera Cluster
十七、效能調優
伺服器配置最佳化
# my.cnf 關鍵引數[mysqld]# 緩衝池大小(通常為系統記憶體的50-80%)innodb_buffer_pool_size =4G# 日誌檔案大小innodb_log_file_size =256M# 併發連線數max_connections =500# 查詢快取(MySQL 8.0已移除)query_cache_size =64Mquery_cache_type =1# 臨時表大小tmp_table_size =64Mmax_heap_table_size =64M
查詢最佳化
-
1. 使用EXPLAIN分析查詢: `EXPLAIN SELECT*FROM students WHERE class ='計算機科學1班';`AI寫程式碼sql
-
2. 最佳化索引: -- 新增適當的索引CREATE INDEX idx_class ON students(class);-- 使用複合索引CREATE INDEX idx_class_score ON students(class, score);
-
3. 重寫查詢: -- 最佳化前SELECT*FROM students WHEREYEAR(created_at) =2022;-- 最佳化後(可以使用索引)SELECT*FROM students WHERE created_at BETWEEN'2022-01-01'AND'2022-12-31';
-
4. 限制結果集大小: -- 使用LIMIT避免返回過多資料SELECT*FROM logs ORDERBY created_at DESC LIMIT 1000;
表最佳化
-- 分析表ANALYZE TABLE students;-- 最佳化表(重建表和索引)OPTIMIZE TABLE students;-- 檢查表是否損壞CHECKTABLE students;-- 修復表REPAIR TABLE students;
監控工具
-
1. MySQL效能模式(Performance Schema): -- 啟用效能模式SETGLOBAL performance_schema =ON;-- 查詢等待事件SELECT*FROM performance_schema.events_waits_summary_global_by_event_nameORDERBY SUM_TIMER_WAIT DESC LIMIT 10;
-
2. MySQL系統變數: -- 檢視系統變數SHOW VARIABLES LIKE'innodb_buffer_pool_size';-- 檢視狀態變數SHOW STATUS LIKE'Threads_connected';
-
3. 慢查詢日誌: # my.cnf 配置slow_query_log =1slow_query_log_file =/var/log/mysql/mysql-slow.loglong_query_time =2
十八、JSON資料型別與操作
MySQL 5.7及更高版本支援原生JSON資料型別:
-- 建立包含JSON欄位的表CREATE TABLE user_profiles ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, profile JSON);-- 插入JSON資料INSERT INTO user_profiles (user_id, profile) VALUES(1, '{"name": "張三", "age": 25, "interests": ["程式設計", "音樂", "旅行"]}');-- 更新JSON資料UPDATE user_profiles SET profile = JSON_SET(profile, '$.age', 26, '$.email', '[email protected]')WHERE user_id =1;-- 查詢JSON資料SELECT user_id, JSON_EXTRACT(profile, '$.name') AS name, JSON_EXTRACT(profile, '$.age') AS ageFROM user_profiles;-- 使用簡化語法(->)SELECT user_id, profile->'$.name'AS name, profile->'$.age'AS ageFROM user_profiles;-- 使用->>運算子(去除引號)SELECT user_id, profile->>'$.name'AS name, profile->>'$.age'AS ageFROM user_profiles;
JSON函式
-- 建立JSON物件SELECTJSON_OBJECT('name', '李四', 'age', 30, 'city', '北京');-- 建立JSON陣列SELECTJSON_ARRAY('程式設計', '音樂', '旅行');-- 合併JSON文件SELECT JSON_MERGE_PRESERVE('{"name": "張三"}', '{"age": 25}');-- 查詢JSON陣列中的元素SELECT JSON_CONTAINS(profile->'$.interests', '"音樂"')FROM user_profiles;-- 提取JSON陣列中的所有元素SELECT JSON_EXTRACT(profile, '$.interests[*]')FROM user_profiles;-- 獲取JSON物件中的所有鍵SELECT JSON_KEYS(profile)FROM user_profiles;
十九、全文搜尋
MySQL支援全文搜尋功能,允許對文字內容進行高效搜尋:
-- 建立帶全文索引的表CREATE TABLE articles ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200), content TEXT, FULLTEXT INDEX idx_content (title, content)) ENGINE=InnoDB;-- 插入資料INSERT INTO articles (title, content) VALUES('MySQL基礎教程', '本文介紹MySQL的基本操作,包括增刪改查等內容...'),('SQL高階技巧', '本文詳細講解SQL的高階用法,包括子查詢、儲存過程等...'),('資料庫最佳化指南', '如何最佳化MySQL資料庫效能,包括索引最佳化、查詢最佳化等...');-- 自然語言模式搜尋SELECT*FROM articlesWHEREMATCH(title, content) AGAINST('MySQL 基礎'INNATURALLANGUAGE MODE);-- 布林模式搜尋SELECT*FROM articlesWHEREMATCH(title, content) AGAINST('+MySQL -高階'INBOOLEAN MODE);-- 帶有擴充套件查詢的搜尋SELECT*FROM articlesWHEREMATCH(title, content) AGAINST('資料庫'WITH QUERY EXPANSION);
全文搜尋運算子(布林模式)
-
• +
:必須包含該詞 -
• -
:必須不包含該詞 -
• >
:增加相關性權重 -
• <
:減少相關性權重 -
• *
:萬用字元 -
• ""
:精確短語匹配
-- 使用布林模式運算子SELECT*FROM articlesWHEREMATCH(title, content) AGAINST('+MySQL +"基礎教程"'INBOOLEAN MODE);
二十、常見問題與最佳實踐
安全最佳實踐
-
1. 定期更新MySQL:保持最新安全補丁 -
2. 使用強密碼:為所有使用者設定強密碼 -
3. 最小許可權原則:只授予使用者必要的許可權 -
4. 加密連線:使用SSL/TLS加密客戶端與伺服器之間的通訊 -
5. 審計日誌:啟用審計日誌記錄關鍵操作
-- 啟用SSL連線CREATEUSER'secure_user'@'%' IDENTIFIED BY'password' REQUIRE SSL;-- 設定密碼策略SETGLOBAL validate_password.policy = STRONG;
效能最佳實踐
-
1. 適當使用索引:為常用查詢條件建立索引,但避免過多索引 -
2. **避免SELECT ***:只查詢需要的列 -
3. 使用批次操作:批次插入比單條插入更高效 -
4. 定期維護表:分析和最佳化表 -
5. 合理設定快取:根據系統記憶體配置適當的緩衝池大小
常見錯誤與解決方案
-
1. Too many connections: -- 增加最大連線數SETGLOBAL max_connections =500;-- 檢視當前連線SHOW PROCESSLIST;-- 終止空閒連線KILL connection_id;
-
2. Deadlock found: -- 檢視最後一個死鎖資訊SHOW ENGINE INNODB STATUS;-- 調整事務隔離級別SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-
3. Table is full: -- 增加臨時表大小SETGLOBAL tmp_table_size =128M;SETGLOBAL max_heap_table_size =128M;
總結
本文透過理論與例項詳細介紹了MySQL資料庫的基礎知識和高階特性:
-
1. 基礎操作:資料庫和表的建立、修改和刪除 -
2. CRUD操作:資料的增刪改查 -
3. 高階查詢:連線、子查詢、視窗函式和CTE -
4. 資料庫管理:事務控制、索引最佳化、備份恢復 -
5. 高階特性:儲存過程、觸發器、檢視、分割槽表 -
6. 效能與安全:效能調優、使用者管理、安全最佳實踐
熟練掌握這些知識點,可以幫助你構建高效、安全、可靠的MySQL資料庫應用。隨著對MySQL的深入學習和實踐,你將能夠解決更復雜的資料管理和分析需求,為應用程式提供強大的資料支援。
記住,在生產環境中使用MySQL時,務必關注資料安全性、效能最佳化和備份恢復等關鍵問題,確保資料庫系統的穩定和可靠執行。持續學習和實踐是成為MySQL專家的關鍵。
連結:https://lethehong.blog.csdn.net/article/details/147492039?spm=1001.2014.3001.5502
(版權歸原作者所有,侵刪)
文末福利
就目前來說,傳統運維衝擊年薪30W+的轉型方向就是SRE&DevOps崗位。
為了幫助大家早日擺脫繁瑣的基層運維工作,給大家整理了一套高階運維工程師必備技能資料包,內容有多詳實豐富看下圖!
共有 20 個模組





······



以上所有資料獲取請掃碼
備註:最新運維資料

100%免費領取
(後臺不再回復,掃碼一鍵領取