一、數據存儲概述
在計算機系統中,數據可以存儲在多種形式中:
-
變量:程序中最基本的數據存儲單元
-
元組:不可變的序列類型,常用于函數返回多個值
-
列表:有序可變集合,可存儲不同類型元素
-
字典:鍵值對集合,提供快速查找
-
集合:無序不重復元素集
-
文件:
-
XML文件:
<name>ZS</name>
-
YAML文件:
name: ZS
-
JSON文件:
{"name":"zs"}
-
二、數據庫分類
1. 關系型數據庫(RDBMS)
-
MySQL
-
Oracle
-
SQL Server
-
PostgreSQL
特點:
-
采用關系模型組織數據
-
數據以行和列的形式存儲(表結構)
-
支持SQL語言
-
強調數據一致性和完整性
2. 非關系型數據庫(NoSQL)
-
Redis(鍵值存儲)
-
MongoDB(文檔存儲)
-
Cassandra(列存儲)
-
Neo4j(圖數據庫)
特點:
-
靈活的數據模型
-
高擴展性和可用性
-
適合處理大規模數據
-
不強制要求固定表結構
三、數據庫選擇策略
關系型數據庫適用場景
-
需要嚴格的數據一致性和事務支持
-
銀行轉賬(ACID事務)
-
訂單支付
-
庫存扣減
-
-
復雜查詢和關聯分析
-
多表關聯(JOIN)
-
聚合函數(GROUP BY)
-
子查詢等
-
-
數據結構穩定且規范
-
字段固定(如用戶表包含[id, name, email])
-
Schema需預先定義
-
非關系型數據庫適用場景
-
高并發寫入和水平擴展需求
-
物聯網設備數據(每秒百萬級寫入)
-
社交媒體的用戶動態
-
-
靈活或非結構化數據
-
動態字段(如用戶自定義屬性)
-
嵌套數據(如評論的回復樹)
-
-
特定查詢模式優化
-
圖數據庫(Neo4j):處理復雜關系
-
列存儲(Cassandra):時間序列數據
-
四、MySQL數據庫詳解
1. MySQL概述
MySQL是一個開源的關系型數據庫管理系統,由瑞典MySQL AB公司開發,現屬于Oracle旗下產品。它是目前最流行的關系型數據庫之一,特別適合Web應用開發。
特點:
-
體積小、速度快
-
總體擁有成本低
-
開源
-
支持多用戶、多線程
2. 安裝與卸載
安裝步驟:
-
下載對應版本(V5.5/V5.7/V8.0)
-
選擇安裝路徑(避免中文路徑)
-
設置root密碼
-
配置字符編碼(推薦UTF-8)
卸載步驟:
-
控制面板中卸載MySQL
-
刪除C盤ProgramData中的MySQL文件夾(隱藏文件夾)
-
清理注冊表(可選)
-
重啟電腦后重新安裝
3. MySQL與Oracle區別
區別項 | MySQL | Oracle |
---|---|---|
字符串類型 | VARCHAR | VARCHAR2 |
自動遞增 | 支持AUTO_INCREMENT | 使用序列(SEQUENCE)實現 |
檢查約束 | MySQL8.0.16+支持 | Oracle9i+支持 |
分組語法 | 允許SELECT非分組字段 | 只允許SELECT分組字段和統計函數 |
分頁語法 | 使用LIMIT | 使用ROWNUM或OFFSET-FETCH |
默認隔離級別 | 可重復讀(REPEATABLE READ) | 讀已提交(READ COMMITTED) |
五、SQL語言詳解
SQL(Structured Query Language)是用于管理關系數據庫的標準語言。
1. SQL分類
-
數據査詢語言(DQL: Data Query Language):也稱為“數據檢索語句”,用以從表中獲得數據,確定數據怎樣在應用程序給出。保留字SELECT是DQL(也是所有SQL)用得最多的動詞,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其它類型的SQL語句一起使用。
-
數據操作語言(DML:Data Manipulation Language):其語句包括動詞INSERT、UPDATE和DELETE。它們分別用于添加、修改和刪除。
-
事務控制語言(TCL:Transaction Control Language):它的語句能確保被DML語句影響的表的所有行及時得以更新。包括COMMIT(提交)命令、SAVEPOINT(保存點)命令、ROLLBACK(回滾)命令。
-
數據控制語言(DCL:Data Control Language):它的語句通過GRANT或REVOKE實現權限控制,確定單個用戶和用戶組對數據庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對表單個列的訪問。
-
數據定義語言(DDL:Data Defination Language):其語句包括動詞CREATE,ALTER和DROP。在數據庫中創建新表或修改、刪除表(CREATE TABLE或 DROP TABLE):為表加入索引等。
2. 基礎SQL命令
數據庫操作
-- 查看所有數據庫
SHOW DATABASES;-- 創建數據庫
CREATE DATABASE dbname;-- 使用數據庫
USE dbname;-- 刪除數據庫
DROP DATABASE dbname;-- 查看數據庫創建信息
SHOW CREATE DATABASE dbname;
表操作
-- 創建表
CREATE TABLE t_user (name VARCHAR(10),age INT(3),address VARCHAR(50)
);-- 查看所有表
SHOW TABLES;-- 查看表結構
DESC t_user;-- 刪除表
DROP TABLE t_user;
修改表結構
-- 刪除列
ALTER TABLE t_user DROP COLUMN name;-- 添加列
ALTER TABLE t_user ADD COLUMN name VARCHAR(10);-- 修改列
ALTER TABLE t_user CHANGE COLUMN name username VARCHAR(15);
3. 常用數據類型
-
INT:整數
-
DOUBLE:浮點數
-
VARCHAR:可變長度字符串
-
DATETIME:日期時間
-
TEXT:長文本
-
BLOB:二進制數據
六、數據增刪改查(CRUD)
1. 增加數據(INSERT)
-- 方式1:全字段插入
INSERT INTO t_user VALUES (12, "beijing", "admin");-- 方式2:指定字段插入
INSERT INTO t_user (age, address) VALUES (12, "beijing");
2. 刪除數據(DELETE)
-- 條件刪除
DELETE FROM t_user WHERE address = "beijing";-- 清空表(慎用)
DELETE FROM t_user;
3. 修改數據(UPDATE)
-- 條件更新
UPDATE t_user SET username="qiaoba" WHERE address="taiyuan";-- 全表更新
UPDATE t_user SET username="qiaoba";
4. 查詢數據(SELECT)
-- 查詢所有數據
SELECT * FROM t_user;-- 查詢特定字段
SELECT name, age FROM t_user;-- 帶條件查詢
SELECT * FROM t_user WHERE age > 18;
七、約束與索引
1. 約束類型
1.非空約束(NOT NULL)
CREATE TABLE t_admin(id INT(5),adminname VARCHAR(10) NOT NULL,password VARCHAR(20)
);
2.唯一約束(UNIQUE)
CREATE TABLE t_person(id INT(5) UNIQUE,adminname VARCHAR(10) NOT NULL,password VARCHAR(20)
);
3.主鍵約束(PRIMARY KEY)
CREATE TABLE t_cat(id INT(5) PRIMARY KEY,name VARCHAR(10),password VARCHAR(20)
);
--或者指定
create table t_person(
id int(5) AUTO_INCREMENT,
name varchar(10),
password varchar(20),
constraint pk_id primary key(id)
);
注:
1.一般將id編號設置為主鍵 (聊到主鍵索引就想到性能)而且每張表建議至少有一個主鍵
2.當主鍵為int數字類型時,一般設置為自動遞增
自動遞增的兩種方式:
????????方式一:mysql數據庫中支持自動遞增,所以可以在創表中追加AUTO_INCREMENT(如果刪除了id為3的,再插入一個,那么他的id是4不是3)
????????方式二:通過python程做自動遞增 id+=1
當主鍵為varchar字符串類型時,無法再做自動遞增,此時還有兩種方式
????????方式一:通過python程序來生成固定格式,并且不會重復的主鍵 id+=1
????????方式二:通過雪花算法(下文會提到)來生成不會重復的主鍵
4.外鍵約束(FOREIGN KEY)
關系:一對多 多對多
CREATE TABLE t_user(id INT(5) AUTO_INCREMENT,name VARCHAR(10),gid INT(5),CONSTRAINT pk_id PRIMARY KEY(id),CONSTRAINT fk_gid FOREIGN KEY(gid) REFERENCES t_group(id)
);
5.檢查約束(CHECK)?(MySQL8.0.16+支持)
CREATE TABLE employees(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),age INT,CONSTRAINT age_check CHECK(age>=18 AND age<=65)
);
2. 自動遞增
-- MySQL自動遞增
CREATE TABLE t_person(id INT(5) PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10),password VARCHAR(20)
);
3. 雪花算法
概述
雪花算法(Snowflake Algorithm)是一種分布式唯一ID生成算法,最早由 Twitter 開發,用來解決在高并發環境下生成全局唯一ID的問題。它的特點是高性能、高可用、趨勢遞增、按時間排序,并且生成的ID不會重復,即使在分布式系統中。
雪花算法的ID結構
雪花算法(Snowflake)是Twitter開發的分布式ID生成算法,生成64位唯一ID,結構如下:
-
1位符號位(始終為0)
-
41位時間戳(毫秒級,69年)
-
10位機器ID(5位數據中心+5位機器ID)
-
12位序列號(每毫秒4096個ID)
優點
- 高性能:本地生成,無需數據庫訪問,生成一個ID只需幾微秒。
- 全局唯一:由時間戳 + 機器號 + 序列號共同決定,天然不會重復。
- 趨勢遞增:基于時間戳生成,保證ID大致按生成時間遞增(方便排序)。
- 適合分布式系統:支持多節點并行生成不沖突的ID。
存在的缺點
- 依賴機器時鐘:如果系統時間回撥,可能會導致ID重復。
- 位數固定:64位中各部分長度寫死,擴展性有限。
- 不適合生成短ID或可讀性強的ID:生成的ID是類似?879278326123438080?的長整型數字。
Python實現簡化版:
import time
import threadingclass Snowflake:def __init__(self, datacenter_id=1, worker_id=1):self.twepoch = 1288834974657self.datacenter_id = datacenter_idself.worker_id = worker_idself.sequence = 0self.last_timestamp = -1self.lock = threading.Lock()def _timestamp(self):return int(time.time() * 1000)def get_id(self):with self.lock:timestamp = self._timestamp()if timestamp == self.last_timestamp:self.sequence = (self.sequence + 1) & 0xfffif self.sequence == 0:while timestamp <= self.last_timestamp:timestamp = self._timestamp()else:self.sequence = 0self.last_timestamp = timestampid = ((timestamp - self.twepoch) << 22) | (self.datacenter_id << 17) | (self.worker_id << 12) | self.sequencereturn id
雪花算法適合哪些場景?
- 訂單號、用戶ID、消息ID、日志ID等需要“唯一標識”的場景
- 多服務、多節點部署的微服務架構
- 替代數據庫自增ID(特別是 varchar 不支持自增的場景)
八、高級查詢
查詢引入:
有數據才能進行查詢操作,在正式學習查詢之前我們先完成建表以及添加數據的操作:
/********************************部門表dept********************************//*創建表*/DROP TABLE? IF EXISTS DEPT;?CREATE TABLE DEPT(DEPTNO INT PRIMARY KEY,?DNAME VARCHAR(14) ,?LOC VARCHAR(13));/********************************員工表emp********************************//*創建表*/DROP TABLE? IF EXISTS EMP;?CREATE TABLE EMP(EMPNO INT PRIMARY KEY,?ENAME VARCHAR(14) ,?JOB VARCHAR(9),?MGR INT,?HIREDATE DATE,?SAL DECIMAL(7,2),?COMM DECIMAL(7,2),?DEPTNO int REFERENCES DEPT);/***************工資等級表salgrade********************************//*創建表*/DROP TABLE? IF EXISTS SALGRADE;?CREATE TABLE SALGRADE(GRADE INT PRIMARY KEY,?LOSAL INT,?HISAL INT);?#工資級別表? 插入數據INSERT INTO salgrade VALUES (1,700,1200);INSERT INTO salgrade VALUES (2,1201,1400);INSERT INTO salgrade VALUES (3,1401,2000);INSERT INTO salgrade VALUES (4,2001,3000);INSERT INTO salgrade VALUES (5,3001,9999);#員工表? 插入數據insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);insert into EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno)values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);#部門表? 插入數據insert into DEPT (deptno, dname, loc)values (10, 'ACCOUNTING', 'NEW YORK');insert into DEPT (deptno, dname, loc)values (20, 'RESEARCH', 'DALLAS');insert into DEPT (deptno, dname, loc)values (30, 'SALES', 'CHICAGO');insert into DEPT (deptno, dname, loc)values (40, 'OPERATIONS', 'BOSTON');???
查詢語法:
語法: select 字段 from 表名
字段: * 表示所有字段
字段:字段1,字段2
字段: 字段1 別名,字段2 別名
字段:去重 distinct關鍵字
1. 條件查詢
-- 比較運算符
查詢薪資高于2000的員工
SELECT * FROM emp WHERE sal > 2000;-- BETWEEN AND
查詢薪資介于1500到5000的員工
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 5000;-- IS NULL
查詢沒有獎金的員工信息
SELECT * FROM emp WHERE comm IS NULL;-- LIKE模糊查詢
SELECT * FROM emp WHERE ename LIKE "%s%"; -- 包含s
SELECT * FROM emp WHERE ename LIKE "s%"; -- s開頭
SELECT * FROM emp WHERE ename LIKE "%s"; -- s結尾
SELECT * FROM emp WHERE ename LIKE "_m%"; -- 第二個字母是m查詢入職日期在1981年的員工信息
select * from emp where hiredate like '%1981%';
select * from emp where hiredate between '1981-01-01' and '1981-12-31';查詢員工編號在7499 7521 7900的員工
select * from emp where empno = 7499 or empno = 7521 or empno = 7900;
select * from emp where empno in(7499,7521,7900);
2. 排序查詢
語法: select 字段 from 表名 [限定語法][排序條件]
排序關鍵字:order by
升序 asc
降序 desc
如果需要根據多個字段進行排列,那么在排序后邊直接追加即可:
select * from 表名 [限定語法][order by 字段1 升序或降序,字段2 升序或降序]-- 單字段排序
按照入職日期做降序排列:
SELECT * FROM emp ORDER BY hiredate DESC;-- 多字段排序
按照入職日期做降序排列,如果入職日期相同,按照薪資做升序排列:
SELECT * FROM emp ORDER BY hiredate DESC, sal ASC;
3. 多表查詢
如果直接查詢所有的員工信息及部門信息select * from emp,dept;
結果:這種查詢方式,簡單的將兩張表堆積在一塊,會帶來數據冗余問題,這種現象稱之為笛卡爾積效應 解決方法:
-- 等值連接(消除笛卡爾積)
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno;-- 自連接(同一表不同別名)
SELECT e1.empno, e1.ename, e2.ename AS manager
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno;
4. 連接查詢(在JOIN操作中,將小表放在前面)
1. 內連接(INNER JOIN)
特點:只返回兩個表中匹配的行
-- 標準語法
SELECT 列名 FROM 表1
INNER JOIN 表2 ON 表1.列 = 表2.列;-- 示例:查詢員工及其部門信息
SELECT e.empno, e.ename, d.dname
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno;
等價寫法(使用WHERE子句):
SELECT e.empno, e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
2. 左外連接(LEFT JOIN / LEFT OUTER JOIN)
特點:返回左表所有記錄,即使右表沒有匹配
SELECT 列名 FROM 表1
LEFT JOIN 表2 ON 表1.列 = 表2.列;-- 示例:查詢所有員工信息,包括沒有部門的員工
SELECT e.empno, e.ename, d.dname
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno;
3. 右外連接(RIGHT JOIN / RIGHT OUTER JOIN)
特點:返回右表所有記錄,即使左表沒有匹配
SELECT 列名 FROM 表1
RIGHT JOIN 表2 ON 表1.列 = 表2.列;-- 示例:查詢所有部門信息,包括沒有員工的部門
SELECT e.empno, e.ename, d.dname
FROM emp e
RIGHT JOIN dept d ON e.deptno = d.deptno;
4. 全外連接(FULL JOIN / FULL OUTER JOIN)
特點:返回兩表所有記錄,沒有匹配的用NULL填充
-- MySQL不直接支持FULL JOIN,可用UNION實現
SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列 = 表2.列
UNION
SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 表1.列 = 表2.列;-- 示例:查詢所有員工和部門信息
SELECT e.empno, e.ename, d.dname
FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno
UNION
SELECT e.empno, e.ename, d.dname
FROM emp e RIGHT JOIN dept d ON e.deptno = d.deptno;
5. 交叉連接(CROSS JOIN)
特點:返回兩表的笛卡爾積
SELECT 列名 FROM 表1 CROSS JOIN 表2;-- 等價寫法
SELECT 列名 FROM 表1, 表2;
6. 自連接(SELF JOIN)
特點:表與自身連接
-- 示例:查詢員工及其經理信息
SELECT e1.empno AS 員工ID, e1.ename AS 員工姓名, e2.empno AS 經理ID, e2.ename AS 經理姓名
FROM emp e1
LEFT JOIN emp e2 ON e1.mgr = e2.empno;
5. 分組查詢
語法:select字段 from 表名[連接條件][限定語法][排序條件]
group by
注意事項:
1.一旦出現分組,那么se1ect后邊只允許出現分組字段及統計函數
2.統計函數可以單獨使用
3.如果出現統計函數嵌套,那么在select后邊只允許出現統計函數
4.分組之后如果還要使用條件篩選,不允許使用where,改為having
查詢公司所有職位
select job,count(empno) from emp group by job;
查詢每個部門的平均工資
select job,count(empno),avg(sal) from emp group by job;
查詢每個部門的詳細信息,包含平均工資
select emp.job,count(empno),avg(sal),dept.dname from emp left join dept on emp.deptno = dept.deptno group by emp.job;
查詢平均薪資高于2000的部門信息
select emp.job,count(empno),avg(sal),dept.dname from emp left join dept on emp.deptno = dept.deptno group by emp.job having avg(emp.sal)>2000;
統計函數
統計數量 count
平均值 avg
最大值 max
最小值 min
求和 sum
6. 子查詢
--where子查詢:當查詢的結果為單行單列或多行單列時
SELECT * FROM emp
查詢比Smith工資高的員工信息
WHERE sal > (SELECT sal FROM emp WHERE ename = "smith");-- from子查詢:當查詢的結果為多行多列時
查詢部門編號,部門名稱,部門位置,部門人數,平均薪資的信息
SELECT d.deptno, d.dname, temp.avg_sal
FROM dept d LEFT JOIN (SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno
) temp ON d.deptno = temp.deptno;
=any in
比最大值小的數據:<any
比最小值大的數據: >any
比最大值大的數據: >all
比最小值小的數據: <all
7. 分頁查詢
語法:select字段 from 表名[連接條件][限定語法][分組查詢][排序條件][分頁查詢]
分頁關鍵字:limit n,m
n:數據下標索引
m:每頁顯示的條數
當n為0的時候,說明用戶要查詢首頁的數據,n可以省略不寫
-- 基本分頁
SELECT * FROM emp LIMIT 0, 10; -- 第一頁
SELECT * FROM emp LIMIT 10, 10; -- 第二頁-- 簡化寫法(首頁)
SELECT * FROM emp LIMIT 10;
九、數據庫設計實踐
1. 一對多關系
-- 組表
CREATE TABLE t_group(id INT(5) AUTO_INCREMENT,gname VARCHAR(10),CONSTRAINT pk_id PRIMARY KEY(id)
);-- 用戶表(帶外鍵)
CREATE TABLE t_user(id INT(5) AUTO_INCREMENT,name VARCHAR(10),gid INT(5),CONSTRAINT pk_id PRIMARY KEY(id),CONSTRAINT fk_gid FOREIGN KEY(gid) REFERENCES t_group(id)
);
2. 多對多關系
-- 學生表
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20)
);-- 課程表
CREATE TABLE course(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20)
);-- 學生課程關聯表
CREATE TABLE student_course(sid INT,cid INT,PRIMARY KEY(sid, cid),FOREIGN KEY(sid) REFERENCES student(id),FOREIGN KEY(cid) REFERENCES course(id)
);
3. 級聯操作
-- 級聯刪除
CREATE TABLE t_user(id INT(5) AUTO_INCREMENT,gid INT(5),CONSTRAINT fk_gid FOREIGN KEY(gid) REFERENCES t_group(id) ON DELETE CASCADE
);-- 級聯置空
CREATE TABLE t_user(id INT(5) AUTO_INCREMENT,gid INT(5),CONSTRAINT fk_gid FOREIGN KEY(gid) REFERENCES t_group(id) ON DELETE SET NULL
);
十、性能優化建議
-
合理使用索引:為常用查詢條件創建索引
-
避免SELECT *:只查詢需要的字段
-
優化JOIN操作:確保JOIN字段有索引
-
合理分頁:大數據量使用LIMIT分頁
-
避免全表掃描:使用EXPLAIN分析查詢
-
事務優化:短事務,及時提交
-
適當拆分表:大表垂直或水平拆分
十一、常見問題解決方案
-
連接問題:
-
檢查服務是否啟動
-
檢查用戶名密碼
-
檢查防火墻設置
-
-
中文亂碼:
-
確保數據庫、表、連接都使用UTF-8編碼
-
設置連接參數:
charset='utf8mb4'
-
-
性能問題:
-
使用EXPLAIN分析慢查詢
-
優化SQL語句
-
添加適當索引
-
-
事務問題:
-
檢查隔離級別設置
-
確保事務及時提交或回滾
-
避免長事務
-
十二、學習資源推薦
-
官方文檔:MySQL官方文檔是最權威的學習資料
-
在線教程:菜鳥教程、W3School等
-
書籍推薦:
-
《高性能MySQL》
-
《MySQL必知必會》
-
《SQL進階教程》
-
-
實踐平臺:LeetCode數據庫題目、牛客網SQL練習題