【EasyPan】項目常見問題解答(自用&持續更新中…)匯總版
MySQL主鍵與索引核心作用解析
一、主鍵(PRIMARY KEY)核心作用
1. 數據唯一標識
-- 創建表時定義主鍵
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL
);
- 唯一性約束:確保每行數據有唯一標識符
- 非空約束:主鍵列不允許NULL值
- 物理排序:InnoDB按主鍵順序組織存儲(聚簇索引)
2. 性能優化
場景 | 效果 |
---|---|
WHERE條件查詢 | 直接定位到數據頁 |
關聯查詢(JOIN) | 快速匹配關聯表數據 |
范圍查詢 | 利用B+樹的有序特性加速 |
二、索引(INDEX)核心作用
1. 基礎索引類型
-- 創建普通索引
CREATE INDEX idx_email ON users(email);-- 創建唯一索引
CREATE UNIQUE INDEX uq_username ON users(username);
2. 核心功能對比
功能 | 主鍵 | 普通索引 | 唯一索引 |
---|---|---|---|
唯一性 | ? 強制 | ? 不保證 | ? 強制 |
NULL值 | ? 不允許 | ? 允許 | ? 允許(但僅限NULL) |
數量限制 | 每表1個 | 每表多個 | 每表多個 |
自動創建 | 自動創建聚簇索引 | 需手動創建 | 需手動創建 |
3. 查詢優化原理
三、實戰應用場景
1. 必須使用主鍵的場景
- 作為外鍵關聯的基礎
- 需要物理排序的業務(如時間線數據)
- 高頻WHERE條件查詢的列
2. 適合建索引的場景
-- 復合索引示例
ALTER TABLE orders ADD INDEX idx_status_created (status, created_at);
場景 | 索引類型建議 | 示例字段 |
---|---|---|
等值查詢 | 普通索引 | user_id, order_no |
范圍查詢 | 復合索引 | created_at, price |
排序操作 | 覆蓋索引 | 排序字段+查詢字段 |
統計分組 | 復合索引 | group_type, region |
四、注意事項
-
索引代價:
- 寫操作變慢(需維護索引結構)
- 占用額外存儲空間
-
設計原則:
- 選擇區分度高的列(如ID > 狀態字段)
- 避免過度索引(一般不超過5-6個)
- 定期使用
EXPLAIN
分析查詢計劃
-
失效場景:
-- 索引失效案例 SELECT * FROM users WHERE LEFT(username,3) = 'abc'; -- 應改為: SELECT * FROM users WHERE username LIKE 'abc%';
五、性能對比測試
數據量 | 無索引查詢 | 有索引查詢 | 提升倍數 |
---|---|---|---|
10萬行 | 1200ms | 5ms | 240x |
100萬行 | 9500ms | 8ms | 1187x |
MySQL主鍵與索引的生活化解釋
一、主鍵:就像身份證號
1. 基本特性
- 🆔 唯一標識:每個學生學號、每張快遞單號都不重復
- 🚫 不能為空:就像"無名氏"不能辦銀行卡
- 📌 快速定位:快遞員憑單號秒找包裹(數據庫憑主鍵秒查數據)
2. 生活場景
[圖書館管理系統]
├── 書號_PK001 --> 《三體》 --> A區3架2層
├── 書號_PK002 --> 《小王子》 --> B區1架5層
└── 書號_PK003 --> 《紅樓夢》 --> C區2架3層
- 書號=主鍵,能快速找到具體書籍
二、索引:就像字典目錄
1. 普通索引(新華字典拼音查字法)
-- 給"學生姓名"加索引
ALTER TABLE students ADD INDEX idx_name (name);
- 📖 快速查找:不用翻完整本字典,直接查"李"字在哪頁
- 🔍 多本目錄:可以同時有拼音索引、偏旁部首索引
2. 唯一索引(公司工牌系統)
-- 防止重復手機號
CREATE UNIQUE INDEX uq_phone ON customers (phone);
- 👔 防重復:就像公司不允許兩個員工用同一個工號
- ?? 特殊規則:允許"未登記"(NULL),但不允許重復登記
三、主鍵vs索引的區別
主鍵 | 索引 | |
---|---|---|
類比 | 身份證 | 通訊錄 |
數量 | 每人只有1張 | 可以有多個聯系方式 |
作用 | 必須要有且不能重復 | 加速查找但非必須 |
代價 | 免費自帶 | 需要額外維護 |
四、什么時候需要索引?
? 推薦場景
-
高頻搜索:
👉 比如電商平臺按"商品名稱"搜索(給name字段加索引) -
排序需求:
👉 朋友圈按"發布時間"排序(給created_at加索引) -
重要約束:
👉 用戶注冊防重復手機號(給phone加唯一索引)
? 不推薦場景
-
很少查詢的字段:
👎 像"用戶血型"這種幾乎不用的字段 -
頻繁修改的字段:
👎 像"文章閱讀數"這種每分鐘都更新的字段
五、使用技巧
-
復合索引口訣:
👉 把最常用的查詢條件放前面,就像"先查省→再查市"的快遞地址 -
索引維護成本:
?? 每新建一個索引就像多維護一份通訊錄,會增加:- 存儲空間(多占手機內存)
- 更新時間(新增聯系人要同時更新多個通訊錄)
-
實際效果測試:
🔍 用EXPLAIN命令查看,就像檢查快遞員是否真的用了最優路線