首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

20 分鐘 MySQL 入門速成:從關係模型到核心 CRUD 與索引優化

     編輯:MySQL 資料庫相關知識

核心概念速覽

術語說明對應現實
Database數據庫一個檔案櫃
Table表櫃裡的一個抽屜
Column/Field列/字段表頭欄位名
Row/Record行/記錄一行具體數據
Primary Key主鍵身份證號(唯一標識)
Foreign Key外鍵關聯另一張表的主鍵
Index索引目錄/書籤(加速查找)

連接與基礎操作

# 登入
mysql -h 127.0.0.1 -u root -p

# 退出
exit;  -- 或 quit、\q

庫表管理 (DDL)

數據庫

CREATE DATABASE IF NOT EXISTS learn_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE learn_db;
SHOW TABLES;
DESC users;  -- 查看表結構

創建表範例

CREATE TABLE users (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
    username VARCHAR(50) NOT NULL UNIQUE COMMENT '用戶名',
    email VARCHAR(100) NOT NULL UNIQUE COMMENT '郵箱',
    password_hash CHAR(60) NOT NULL COMMENT 'bcrypt 哈希',
    status TINYINT NOT NULL DEFAULT 1 COMMENT '1啟用 0禁用',
    profile_json JSON COMMENT '擴展屬性',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_status (status),
    INDEX idx_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用戶表';

核心 CRUD 操作

INSERT - 新增

-- 指定欄位(推薦)
INSERT INTO users (username, email, password_hash) VALUES ('john', 'john@example.com', '$2y$10$...');

-- 批次插入
INSERT INTO users (username, email, password_hash) VALUES 
    ('alice', 'alice@example.com', '$2y$10$...'),
    ('bob', 'bob@example.com', '$2y$10$...');

-- 衝突處理
INSERT INTO users (username, email, login_count) VALUES ('john', 'john@example.com', 1)
ON DUPLICATE KEY UPDATE login_count = login_count + 1;

SELECT - 查詢

-- 基礎
SELECT id, username, email FROM users WHERE status = 1;

-- 去重
SELECT DISTINCT status FROM users;

-- 排序分頁
SELECT * FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 10 OFFSET 20;

-- 聚合
SELECT status, COUNT(*) AS cnt FROM users GROUP BY status HAVING COUNT(*) > 5;

-- 連接查詢
SELECT u.username, p.bio FROM users u
LEFT JOIN profiles p ON u.id = p.user_id
WHERE u.status = 1;

UPDATE - 更新

UPDATE users SET status = 0, updated_at = NOW() WHERE id = 123;

-- 多表更新
UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.status = 2
WHERE o.total_amount > 10000;

DELETE - 刪除

-- 軟刪除(推薦)
UPDATE users SET status = 0, deleted_at = NOW() WHERE id = 123;

-- 硬刪除
DELETE FROM users WHERE id = 123;

-- 限制刪除行數
DELETE FROM logs WHERE created_at < '2023-01-01' LIMIT 10000;

WHERE 條件構建

操作符示例說明
=, !=, <>status = 1等於/不等於
>, >=, <, <=age >= 18範圍比較
IN / NOT INid IN (1,2,3)集合匹配
BETWEENage BETWEEN 18 AND 60閉區間
LIKEname LIKE '張%'模糊匹配(% 多字符,_ 單字符)
IS NULL / IS NOT NULLdeleted_at IS NULL空值判斷
AND / ORstatus=1 AND age>18邏輯組合

索引基礎與優化

索引類型

-- 普通索引
CREATE INDEX idx_email ON users(email);
ALTER TABLE users ADD INDEX idx_email (email);

-- 唯一索引
CREATE UNIQUE INDEX uk_email ON users(email);

-- 組合索引(最左前綴原則)
CREATE INDEX idx_status_created ON users(status, created_at);

-- 全文索引(MySQL 5.6+ InnoDB 支援)
ALTER TABLE articles ADD FULLTEXT INDEX ft_content (content);

索引設計黃金法則

  1. 最左前綴:組合索引 (a,b,c) 支援 a、a,b、a,b,c 查詢
  2. 高選擇性優先:區分度高的列放前面(如 email > status)
  3. 覆蓋索引:查詢只需掃描索引不回表 SELECT id, email FROM users WHERE email = ?
  4. 避免索引失效:不在索引列上做運算/函數/類型轉換/!=/LIKE '%...'

EXPLAIN 實戰分析

EXPLAIN SELECT * FROM users WHERE email = 'john@example.com';
-- 關鍵列:
-- type: const/ref/range/index/ALL(越左越好)
-- key: 實際使用的索引
-- rows: 預估掃描行數
-- Extra: Using index/Using where/Using filesort 等

常用函數速查

分類函數示例
字符串CONCAT, SUBSTRING, TRIM, REPLACE, LENGTHCONCAT(first_name, ' ', last_name)
日期時間NOW, DATE, DATE_FORMAT, DATEDIFF, DATE_ADDDATE_FORMAT(created_at, '%Y-%m')
數學ROUND, CEIL, FLOOR, RAND, ABSROUND(price, 2)
聚合COUNT, SUM, AVG, MAX, MIN, GROUP_CONCATGROUP_CONCAT(tag SEPARATOR ',')
條件IF, CASE, COALESCE, NULLIFIF(status=1, '啟用', '禁用')
JSON (5.7+)JSON_EXTRACT, ->, ->>, JSON_ARRAY, JSON_OBJECTprofile_json->>'$.avatar'

進階學習路線圖

  1. 事務與鎖機制(ACID、隔離級別、死鎖排查)
  2. 主從複制與讀寫分離架構
  3. 分區表、分庫分表中間件
  4. 效能調優:配置參數、慢查詢分析、Schema 設計
  5. 高可用:MHA、Orchestrator、InnoDB Cluster
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved