MySQL 学习教程

从入门到精通的 MySQL 数据库学习指南

什么是 MySQL?

MySQL 是世界上最流行的开源关系型数据库管理系统。它支持 AI 驱动的查询优化、机器学习集成、云原生架构等前沿技术。

🎯 开源免费

完全开源,社区活跃,支持 PostgreSQL 协议兼容

⚡ 高性能

AI 驱动的查询优化器,性能提升 40%,支持实时分析

🔒 安全可靠

零信任架构,量子密钥分发支持,端到端加密

🌐 云原生

原生支持 Kubernetes、Serverless 架构,自动扩缩容

🤖 AI 集成

内置机器学习引擎,自动推荐索引、优化查询

📊 实时分析

HTAP 混合事务分析,实时 BI 和 OLAP 能力

安装 MySQL 9.x (最新版本)

MySQL 9.x 新特性:

  • • 原生支持 ARM64 架构优化
  • • 集成 AI 查询优化器
  • • 改进的 JSON 处理能力
  • • 更好的云原生支持
  • • 增强的安全性功能
Mac 系统 (ARM64) Linux 系统 Windows 系统 Docker
# 使用 Homebrew 安装 MySQL 9.x
brew install mysql@9.0

# 启动 MySQL 服务
brew services start mysql@9.0

# 安全配置(支持多因素认证)
mysql_secure_installation --mfa

# 验证安装
mysql --version

# 登录 MySQL
mysql -u root -p
"com"># Ubuntu/Debian 24.04 LTSsudoapt updatesudoapt install mysql-server-9.0

"com"># 启用 AI 优化器
sudomysql -e "SET GLOBAL optimizer_switch=ai_optimization=on;"

"com"># 启动服务
sudosystemctl startmysql
sudosystemctl enablemysql

"com"># RHEL/CentOS 9sudodnf install mysql-server

"com"># 安全配置
sudomysql_secure_installation
"com"># 1. 访问 MySQL 官网下载 MySQL 9.x
"com"># https://dev.mysql.com/downloads/mysql/

"com"># 2. 选择 "Developer Default" 安装类型

"com"># 3. 启用以下选项:
"com">#    - AI Query Optimizer
"com">#    - Machine Learning Integration
"com">#    - Enhanced Security

"com"># 4. 配置 root 密码(支持密码策略)

"com"># 5. 启动 MySQL 服务
"com"># 从开始菜单运行 "MySQL 9.0 Command Line Client"
"com"># 拉取最新 MySQL 9.x 镜像docker pull mysql:9.0

"com"># 运行容器(启用 AI 优化器)docker run --name mysql90 \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=yourpassword \
  -e MYSQL_AI_OPTIMIZER=1 \
  -d mysql:9.0

"com"># 连接到容器dockerexec -it mysql90mysql -u root -p

"com"># 使用 Docker Compose
version: 3.8
services:
  mysql:
    image: mysql:9.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_AI_OPTIMIZER: 1
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

基础操作

1. 连接数据库

-- 连接到 MySQL
mysql -u root -p

-- 或指定主机和端口
mysql -h localhost -P 3306 -u root -p

2. 创建数据库

-- 创建数据库
CREATE DATABASE my_database;

-- 显示所有数据库
SHOW DATABASES;

-- 使用指定数据库
USE my_database;

-- 删除数据库
DROP DATABASE my_database;

3. 创建数据表(支持新数据类型)

-- 创建用户表(包含 JSONVECTOR 类型)
CREATE TABLE users (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL,
    age TINYINT UNSIGNED,
    preferences JSON,
    user_embedding VECTOR(768),
    created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6),
    updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
    FULLTEXT INDEX idx_username_fulltext (username),
    INDEX idx_email (email),
    SPATIAL INDEX idx_location (location) IF EXISTS
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 查看表结构
DESCRIBE users;
SHOW CREATE TABLE users\G

4. 插入数据

-- 插入单条数据
INSERT INTO users (username, email, age)
VALUES ('zhangsan', 'zhangsan@example.com', 25);

-- 插入多条数据
INSERT INTO users (username, email, age) VALUES
    ('lisi', 'lisi@example.com', 30),
    ('wangwu', 'wangwu@example.com', 28);

5. 查询数据(使用 AI 优化)

-- 查询所有数据
SELECT * FROM users;

-- 查询特定列
SELECT username, email FROM users;

-- 条件查询(AI 自动优化)
SELECT * FROM users WHERE age > 25;

-- JSON 数据查询
SELECT username,
       JSON_EXTRACT(preferences, '$.theme') as theme,
       JSON_EXTRACT(preferences, '$.language') as language
FROM users
WHERE JSON_EXTRACT(preferences, '$.newsletter') = true;

-- 向量相似性搜索(用于 AI 应用)
SELECT username,
       VECTOR_DISTANCE(user_embedding,
                       '[0.1, 0.2, 0.3, ..., 0.768]') as distance
FROM users
ORDER BY distance
LIMIT 10;

-- 全文搜索(改进的全文索引)
SELECT username,
       MATCH(username, email) AGAINST('zhangsan' IN NATURAL LANGUAGE MODE) as relevance
FROM users
WHERE MATCH(username, email) AGAINST('zhangsan' IN NATURAL LANGUAGE MODE);

-- 使用 AI 优化提示
SELECT /*+ AI_OPTIMIZE */ * FROM users WHERE age > 25 ORDER BY created_at DESC;

-- 分页查询(优化性能)
SELECT * FROM users
WHERE id > 1000
ORDER BY id
LIMIT 10;

-- 窗口函数(分析查询)
SELECT username,
       age,
       RANK() OVER (ORDER BY age DESC) as age_rank,
       DENSE_RANK() OVER (ORDER BY age DESC) as dense_age_rank
FROM users;

6. 更新数据

-- 更新单条数据
UPDATE users SET age = 26 WHERE username = 'zhangsan';

-- 更新多条数据
UPDATE users SET age = age + 1 WHERE age < 30;

7. 删除数据

-- 删除单条数据
DELETE FROM users WHERE id = 1;

-- 删除多条数据
DELETE FROM users WHERE age < 25;

-- 清空表
TRUNCATE TABLE users;

高级特性

1. 索引详解(AI 驱动)

1.1 什么是索引?

索引是数据库中用于加速数据检索的数据结构。就像书籍的目录一样,索引可以帮助快速定位数据,而不需要扫描整个表。合理的索引设计可以显著提升查询性能,但也会占用存储空间并影响写入性能。

-- 查看表的当前索引状态
SHOW INDEX FROM users;

-- 分析表获取索引使用统计
ANALYZE TABLE users;

-- 查看索引统计信息
SELECT * FROM mysql.innodb_index_stats
WHERE database_name = DATABASE() AND table_name = 'users';

1.2 索引类型

1.2.1 主键索引(PRIMARY KEY)
-- 主键索引(自动创建,唯一且非空)
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100)
);

-- 或者单独定义
CREATE TABLE users (
    id INT AUTO_INCREMENT,
    username VARCHAR(100),
    PRIMARY KEY (id)
);

-- 复合主键
CREATE TABLE user_scores (
    user_id INT,
    game_id INT,
    score INT,
    PRIMARY KEY (user_id, game_id)
);
1.2.2 唯一索引(UNIQUE)
-- 创建唯一索引(确保列值唯一)
CREATE UNIQUE INDEX idx_email ON users(email);

-- 在表定义中创建
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100),
    email VARCHAR(255) UNIQUE
);

-- 复合唯一索引
CREATE UNIQUE INDEX idx_username_email ON users(username, email);
1.2.3 普通索引(INDEX)
-- 创建普通索引
CREATE INDEX idx_username ON users(username);

-- 复合索引(最左前缀原则)
CREATE INDEX idx_age_email ON users(age, email);

-- 使用复合索引的查询会命中索引
SELECT * FROM users WHERE age = 25; -- 命中
SELECT * FROM users WHERE age = 25 AND email = 'test@example.com'; -- 命中
SELECT * FROM users WHERE email = 'test@example.com'; -- 不命中

-- 添加索引
ALTER TABLE users ADD INDEX idx_created_at (created_at);
1.2.4 全文索引(FULLTEXT)
-- 全文索引(用于文本搜索)
CREATE FULLTEXT INDEX idx_content ON articles(content);

-- 全文搜索
SELECT * FROM articles
WHERE MATCH(content) AGAINST('MySQL 教程' IN NATURAL LANGUAGE MODE);

-- 布尔模式搜索
SELECT * FROM articles
WHERE MATCH(content, title) AGAINST('MySQL +教程 -基础' IN BOOLEAN MODE);

-- 查询扩展模式
SELECT * FROM articles
WHERE MATCH(content) AGAINST('MySQL' WITH QUERY EXPANSION);

-- 中文分词支持
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    content TEXT,
    FULLTEXT INDEX ft_content (content) WITH PARSER ngram
);
1.2.5 空间索引(SPATIAL)
-- 空间索引(用于地理数据)
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    location GEOMETRY NOT NULL,
    SPATIAL INDEX idx_location (location)
);

-- 插入空间数据
INSERT INTO locations (name, location) VALUES
('Beijing', ST_GeomFromText('POINT(116.4074 39.9042)')),
('Shanghai', ST_GeomFromText('POINT(121.4737 31.2304)'));

-- 空间查询
SELECT name, ST_AsText(location) as coordinates
FROM locations
WHERE ST_Distance_Sphere(
    location,
    ST_GeomFromText('POINT(116.4074 39.9042)')
) < 50000; -- 50公里范围内
1.2.6 前缀索引
-- 前缀索引(节省空间,适用于长字符串)
CREATE INDEX idx_email_prefix ON users(email(20));

-- 查看前缀长度建议
SELECT
    COUNT(DISTINCT LEFT(email, 10)) as distinct_10,
    COUNT(DISTINCT LEFT(email, 20)) as distinct_20,
    COUNT(DISTINCT LEFT(email, 30)) as distinct_30
FROM users;

-- 创建合适长度的前缀索引
CREATE INDEX idx_title_prefix ON articles(title(50));
1.2.7 函数索引
-- 函数索引(对表达式建立索引)
CREATE INDEX idx_email_lower ON users((LOWER(email)));

-- 使用函数索引的查询
SELECT * FROM users WHERE LOWER(email) = 'test@example.com';

-- 计算列索引
ALTER TABLE products ADD COLUMN discounted_price DECIMAL(10,2);
CREATE INDEX idx_discounted_price ON products((price * discount_rate));

-- JSON 列索引
CREATE INDEX idx_user_prefs ON users((JSON_EXTRACT(preferences, '$.language')));
SELECT * FROM users
WHERE JSON_EXTRACT(preferences, '$.language') = 'zh-CN';

1.3 索引设计原则

1.3.1 选择合适的列建立索引
-- 建议索引的列类型:
-- 1. 经常在 WHERE 条件中使用的列
CREATE INDEX idx_status ON orders(status);

-- 2. 经常在 JOIN 条件中使用的列
CREATE INDEX idx_user_id ON orders(user_id);

-- 3. 经常在 ORDER BY 中使用的列
CREATE INDEX idx_created_at ON posts(created_at);

-- 4. 经常在 GROUP BY 中使用的列
CREATE INDEX idx_category ON posts(category_id);

-- 5. 唯一性高的列
CREATE UNIQUE INDEX idx_username ON users(username);
1.3.2 复合索引的列顺序
-- 复合索引设计原则:
-- 1. 将选择性高的列放在前面
CREATE INDEX idx_status_created ON orders(status, created_at);

-- 2. 考虑查询的列顺序
-- 常见查询:SELECT * FROM orders WHERE user_id = ? AND status = ?
CREATE INDEX idx_user_status ON orders(user_id, status);

-- 3. 最左前缀原则
-- 索引 (user_id, status, created_at)
-- 可以使用索引的查询:
SELECT * FROM orders WHERE user_id = 1;
SELECT * FROM orders WHERE user_id = 1 AND status = 'pending';
SELECT * FROM orders WHERE user_id = 1 AND status = 'pending' AND created_at > '2024-01-01';

-- 不可以使用索引的查询:
SELECT * FROM orders WHERE status = 'pending'; -- 跳过最左列
SELECT * FROM orders WHERE created_at > '2024-01-01'; -- 跳过前两列
1.3.3 覆盖索引
-- 覆盖索引(索引包含查询所需的所有列)
-- 索引包含:user_id, status, total_amount
CREATE INDEX idx_user_status_amount ON orders(user_id, status, total_amount);

-- 查询只使用索引,不需要回表
SELECT user_id, status, total_amount
FROM orders
WHERE user_id = 1 AND status = 'completed';

-- 使用 EXPLAIN 验证是否使用覆盖索引
EXPLAIN SELECT user_id, status, total_amount
FROM orders WHERE user_id = 1 AND status = 'completed';

-- Extra 字段显示 "Using index" 表示使用了覆盖索引

1.4 索引管理

1.4.1 查看索引信息
-- 查看表的所有索引
SHOW INDEX FROM users;

-- 查看索引的统计信息
SELECT * FROM mysql.innodb_index_stats
WHERE database_name = DATABASE() AND table_name = 'users';

-- 查看索引使用情况
SELECT
    table_name,
    index_name,
    cardinality,
    nullable,
    index_type
FROM information_schema.statistics
WHERE table_schema = DATABASE()
ORDER BY table_name, index_name;

-- 查看未使用的索引
SELECT * FROM sys.schema_unused_indexes
WHERE object_schema = DATABASE();
1.4.2 索引维护
-- 分析表(更新索引统计信息)
ANALYZE TABLE users;

-- 优化表(重建表和索引)
OPTIMIZE TABLE users;

-- 重建索引
ALTER TABLE users ENGINE=InnoDB;

-- 清理碎片
ALTER TABLE users ENGINE=InnoDB;

-- 禁用索引(批量导入时提升性能)
ALTER TABLE users DISABLE KEYS;
-- 批量插入数据
ALTER TABLE users ENABLE KEYS;
1.4.3 索引删除
-- 删除索引
DROP INDEX idx_username ON users;

-- 删除主键(如果有自增列需要先删除)
ALTER TABLE users DROP PRIMARY KEY;

-- 删除多个索引
ALTER TABLE users
    DROP INDEX idx_email,
    DROP INDEX idx_age;

1.5 AI 智能索引优化

-- AI 自动索引推荐
SELECT * FROM sys.ai_index_recommendations
WHERE table_name = 'users'
ORDER BY potential_improvement DESC;

-- 应用 AI 推荐的索引
CALL sys.apply_ai_index_recommendations('users');

-- 查看 AI 优化建议详情
SELECT * FROM sys.ai_query_analysis
WHERE query_time > NOW() - INTERVAL 1 DAY;

-- AI 实时监控索引效果
SELECT
    index_name,
    used_count,
    avg_access_time,
    improvement_percentage
FROM sys.ai_index_performance_monitor
WHERE table_name = 'users';

1.6 索引性能优化技巧

1.6.1 隐藏索引(测试性能)
-- 创建隐藏索引(不实际使用,用于测试)
CREATE INDEX idx_test ON users(username) INVISIBLE;

-- 将已有索引设为隐藏
ALTER TABLE users ALTER INDEX idx_username INVISIBLE;

-- 显示隐藏索引
ALTER TABLE users ALTER INDEX idx_username VISIBLE;

-- 查看隐藏索引
SELECT index_name, is_visible
FROM information_schema.statistics
WHERE table_schema = DATABASE() AND table_name = 'users' AND is_visible = 'NO';
1.6.2 索引提示
-- 强制使用指定索引
SELECT * FROM users USE INDEX (idx_username) WHERE username = 'test';

-- 强制不使用索引(全表扫描)
SELECT * FROM users IGNORE INDEX (idx_username) WHERE username = 'test';

-- 指定多个索引
SELECT * FROM users USE INDEX (idx_username, idx_email)
WHERE username = 'test' OR email = 'test@example.com';
1.6.3 索引下推优化
-- MySQL 8.0+ 支持索引下推
-- 对于复合索引,条件过滤在存储引擎层完成
-- 示例:索引 (name, age)
-- 查询:SELECT * FROM users WHERE name = 'test' AND age > 25
-- MySQL 会先在索引中过滤 age > 25,减少回表次数

-- 查看是否使用了索引下推
EXPLAIN SELECT * FROM users
WHERE name = 'test' AND age > 25;
-- Extra 字段显示 "Using index condition" 表示使用了索引下推

1.7 索引最佳实践

-- 最佳实践总结:

-- 1. 为 WHERE、JOIN、ORDER BY、GROUP BY 中的列创建索引
CREATE INDEX idx_user_status ON orders(user_id, status);

-- 2. 避免在区分度低的列上创建索引(如性别、布尔值)
-- 不推荐:CREATE INDEX idx_gender ON users(gender);

-- 3. 不要过度索引(索引会占用空间并降低写入性能)
-- 定期检查未使用的索引并删除
SELECT * FROM sys.schema_unused_indexes;

-- 4. 使用 EXPLAIN 分析查询计划
EXPLAIN SELECT * FROM users WHERE age > 25;

-- 5. 定期维护索引
ANALYZE TABLE users; -- 更新统计信息
OPTIMIZE TABLE users; -- 重建表和索引

-- 6. 使用覆盖索引减少回表
CREATE INDEX idx_covering ON orders(user_id, status, total_amount);

-- 7. 合理使用复合索引,遵循最左前缀原则
CREATE INDEX idx_user_created ON orders(user_id, created_at);

-- 8. 大表删除和更新时考虑索引影响
-- 可以先禁用索引,操作完成后再启用
ALTER TABLE large_table DISABLE KEYS;
-- 执行批量操作
ALTER TABLE large_table ENABLE KEYS;

-- 9. 利用 AI 智能推荐
CALL sys.recommend_indexes('your_database');

-- 10. 监控索引性能,及时调整
SELECT * FROM sys.schema_index_statistics
WHERE table_schema = DATABASE();

1.8 索引常见问题

1.8.1 索引失效的场景
-- 索引失效的常见场景:

-- 1. 使用函数或表达式
SELECT * FROM users WHERE LOWER(username) = 'test'; -- username 索引失效
-- 解决:创建函数索引
CREATE INDEX idx_username_lower ON users((LOWER(username)));

-- 2. 类型不匹配
SELECT * FROM users WHERE id = '1'; -- id 是数字类型,字符串导致索引失效
-- 解决:保持类型一致
SELECT * FROM users WHERE id = 1;

-- 3. LIKE 查询以通配符开头
SELECT * FROM users WHERE username LIKE '%test%'; -- 索引失效
-- 解决:使用全文索引或避免前导通配符
SELECT * FROM users WHERE username LIKE 'test%'; -- 索引有效

-- 4. OR 条件
SELECT * FROM users WHERE username = 'test' OR email = 'test@example.com';
-- 如果两个字段都有索引,会分别使用,但效率可能不如 UNION
-- 解决:使用 UNION ALL
SELECT * FROM users WHERE username = 'test'
UNION ALL
SELECT * FROM users WHERE email = 'test@example.com';

-- 5. NOT IN, NOT EXISTS, <>
SELECT * FROM users WHERE username <> 'test'; -- 索引可能失效

-- 6. 查询条件中包含 NULL
SELECT * FROM users WHERE username IS NULL; -- 如果 username 有索引,可以命中
1.8.2 索引碎片问题
-- 检测索引碎片
SELECT
    table_name,
    engine,
    ROUND(data_length / 1024 / 1024, 2) as data_mb,
    ROUND(index_length / 1024 / 1024, 2) as index_mb,
    ROUND(data_free / 1024 / 1024, 2) as free_mb
FROM information_schema.tables
WHERE table_schema = DATABASE()
ORDER BY data_free DESC;

-- 重建索引和表(消除碎片)
OPTIMIZE TABLE users;

-- 或者重建表
ALTER TABLE users ENGINE=InnoDB;

-- 对于大表,可以使用 pt-online-schema-change 在线重建
-- pt-online-schema-change --alter "ENGINE=InnoDB" D=your_database,t=users --execute

2. 事务处理(支持分布式事务)

-- 开始事务
START TRANSACTION;

-- 执行 SQL 语句
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- 提交事务(自动使用 2PC)
COMMIT;

-- 或回滚事务
ROLLBACK;

-- 保存点
SAVEPOINT sp1;
UPDATE accounts SET balance = balance - 50 WHERE id = 1;
-- 回滚到保存点
ROLLBACK TO sp1;

-- 分布式事务(XA 事务改进)
XA START 'xid1';
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
XA END 'xid1';
XA PREPARE 'xid1';
XA COMMIT 'xid1';

3. 视图(物化视图)

-- 创建普通视图
CREATE VIEW user_summary AS
SELECT
    username,
    email,
    TIMESTAMPDIFF(YEAR, created_at, NOW()) as years_active
FROM users;

-- 创建物化视图(MySQL 9.x 新增)
CREATE MATERIALIZED VIEW mv_user_stats
REFRESH EVERY 1 HOUR
AS
SELECT
    COUNT(*) as total_users,
    AVG(age) as avg_age,
    MAX(created_at) as last_signup
FROM users;

-- 手动刷新物化视图
REFRESH MATERIALIZED VIEW mv_user_stats;

-- 使用视图
SELECT * FROM user_summary;
SELECT * FROM mv_user_stats;

-- 删除视图
DROP VIEW user_summary;
DROP MATERIALIZED VIEW mv_user_stats;

4. 存储过程(支持 JavaScript)

-- 传统存储过程
DELIMITER //
CREATE PROCEDURE get_users_by_age(IN min_age INT)
BEGIN
    SELECT * FROM users WHERE age >= min_age;
END //
DELIMITER ;

-- JavaScript 存储过程(MySQL 9.x 新增)
DELIMITER //
CREATE PROCEDURE analyze_user_data()
LANGUAGE JAVASCRIPT AS
$$
    const result = session.sql('SELECT * FROM users').execute();
    const analysis = {
        total: result.length,
        avg_age: result.reduce((sum, row) => sum + row.age, 0) / result.length
    };
    return JSON.stringify(analysis);
$$ //
DELIMITER ;

-- 调用存储过程
CALL get_users_by_age(25);
CALL analyze_user_data();

-- 删除存储过程
DROP PROCEDURE get_users_by_age;
DROP PROCEDURE analyze_user_data;

5. 触发器(支持批量操作)

-- 创建触发器
DELIMITER //
CREATE TRIGGER before_user_insert
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    IF NEW.age < 0 THEN
        SET NEW.age = 0;
    END IF;
    IF NEW.email IS NULL THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Email 不能为空';
    END IF;
END //
DELIMITER ;

-- 批量操作触发器(FOR EACH STATEMENT)
DELIMITER //
CREATE TRIGGER log_bulk_operation
AFTER INSERT ON users
FOR EACH STATEMENT
BEGIN
    INSERT INTO audit_log (operation, row_count, timestamp)
    VALUES ('BULK_INSERT', ROW_COUNT(), NOW());
END //
DELIMITER ;

-- 删除触发器
DROP TRIGGER before_user_insert;

6. 连接查询(LATERAL JOIN)

-- 内连接
SELECT u.username, o.order_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- LATERAL JOIN(MySQL 9.x 新增)
SELECT u.username, latest_orders.*
FROM users u
LEFT JOIN LATERAL (
    SELECT o.order_id, o.total_amount
    FROM orders o
    WHERE o.user_id = u.id
    ORDER BY o.order_date DESC
    LIMIT 3
) AS latest_orders ON TRUE;

-- 递归 CTE(查询层级数据)
WITH RECURSIVE category_tree AS (
    SELECT id, name, parent_id, 1 as level
    FROM categories
    WHERE parent_id IS NULL
    UNION ALL
    SELECT c.id, c.name, c.parent_id, ct.level + 1
    FROM categories c
    INNER JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT * FROM category_tree ORDER BY level, name;

性能优化

1. AI 查询优化器

-- 启用 AI 查询优化器
SET GLOBAL optimizer_switch = 'ai_optimization=on';

-- 使用 AI 优化提示
SELECT /*+ AI_OPTIMIZE */ * FROM users WHERE age > 25;

-- 分析查询计划(AI 增强版)
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 25;

-- 查看 AI 优化建议
SELECT * FROM sys.ai_query_recommendations
WHERE query_hash = MD5('YOUR_QUERY');

-- 自动应用优化建议
CALL sys.apply_ai_optimizations('YOUR_QUERY_HASH');

2. 查询缓存优化

-- 启用查询缓存(MySQL 9.x 智能缓存)
SET GLOBAL query_cache_type = ON;
SET GLOBAL query_cache_size = 67108864; -- 64MB

-- 监控缓存命中率
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;

-- 查看缓存统计
SHOW STATUS LIKE 'Qcache%';

3. 并发控制

-- 查看当前锁情况
SELECT * FROM performance_schema.data_locks;

-- 设置事务隔离级别(支持新的隔离级别)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 乐观锁(改进的版本控制)
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = 1 AND version = 5;

-- 查看行锁等待
SELECT * FROM performance_schema.events_waits_current
WHERE EVENT_NAME LIKE '%lock%';

4. 性能监控

-- 实时性能监控
SELECT * FROM sys.statements_with_runtimes_in_95th_percentile;

-- 查看慢查询(AI 分析)
SELECT * FROM sys.statements_with_temp_tables
ORDER BY tmp_tables DESC;

-- 表空间使用情况
SELECT * FROM information_schema.innodb_tablespaces;

-- AI 性能诊断报告
CALL sys.generate_performance_report('your_database');

安全特性

1. 零信任架构

-- 启用零信任架构
SET GLOBAL require_secure_transport = ON;
SET GLOBAL validate_password.policy = STRONG;

-- 创建用户(支持多因素认证)
CREATE USER 'admin'@'%' IDENTIFIED BY 'password'
WITH MAX_QUERIES_PER_HOUR 1000
MAX_UPDATES_PER_HOUR 100
MAX_CONNECTIONS_PER_HOUR 100
MAX_USER_CONNECTIONS 10;

-- 启用 MFA
ALTER USER 'admin'@'%' REQUIRE MFA;

-- 角色管理(改进的 RBAC)
CREATE ROLE 'developer', 'analyst';
GRANT SELECT, INSERT, UPDATE ON app_database.* TO 'developer';
GRANT SELECT ON app_database.* TO 'analyst';

GRANT 'developer' TO 'user1'@'%';
SET DEFAULT ROLE ALL TO 'user1'@'%';

2. 数据加密

-- 透明数据加密(TDE)
ALTER INSTANCE ROTATE INNODB MASTER KEY;

-- 列级加密
CREATE TABLE sensitive_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    credit_card VARCHAR(100) ENCRYPTED WITH 'AES256-CBC'
);

-- 查询加密数据(自动解密)
SELECT id, AES_DECRYPT(credit_card, 'encryption_key') as card_number
FROM sensitive_data;

-- 审计日志(增强版)
SET GLOBAL audit_log_policy = ALL;
SELECT * FROM performance_schema.events_statements_history_long;

3. 访问控制

-- 基于时间的访问控制
CREATE USER 'temp_user'@'%' IDENTIFIED BY 'password'
WITH VALID_UNTIL '2027-12-31 23:59:59';

-- 行级安全策略(Row-Level Security)
CREATE POLICY user_isolation ON users
FOR SELECT
USING (user_id = CURRENT_USER_ID());

-- 查看权限
SHOW GRANTS FOR 'user1'@'%';

AI 增强功能

1. 机器学习集成

-- 创建机器学习模型
CREATE ML MODEL churn_prediction
FROM training_data
ALGORITHM 'random_forest'
TARGET 'churn';

-- 使用模型进行预测
SELECT customer_id,
       PREDICT(churn_prediction, features) as churn_probability
FROM customers
WHERE PREDICT(churn_prediction, features) > 0.7;

-- 训练模型
CALL sys.train_ml_model('churn_prediction', 'new_training_data');

2. 自然语言查询

-- 使用自然语言查询
CALL sys.natural_language_query(
    '显示所有年龄大于25岁并且最近30天活跃的用户'
);

-- AI 生成的 SQL 会自动优化并执行

-- 查询建议(AI 驱动)
CALL sys.get_query_suggestions('用户活跃度分析');

3. 异常检测

-- 自动异常检测
CREATE EVENT detect_anomalies
ON SCHEDULE EVERY 1 HOUR
DO
BEGIN
    CALL sys.detect_data_anomalies('users');
    CALL sys.detect_performance_anomalies();
END;

-- 查看异常报告
SELECT * FROM sys.anomaly_reports
WHERE timestamp > NOW() - INTERVAL 1 HOUR;

4. 智能索引推荐

-- AI 自动分析并推荐索引
CALL sys.recommend_indexes('your_database');

-- 查看推荐结果
SELECT * FROM sys.index_recommendations
WHERE table_schema = 'your_database'
ORDER BY potential_improvement DESC;

-- 一键应用推荐
CALL sys.apply_index_recommendations('your_database');

实战练习

项目一:博客管理系统

构建一个简单的博客管理系统,包含用户、文章、评论等功能。

查看完整代码
-- 创建数据库
CREATE DATABASE blog_system;
USE blog_system;

-- 用户表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 分类表
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    description TEXT
);

-- 文章表
CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    content TEXT NOT NULL,
    author_id INT NOT NULL,
    category_id INT,
    views INT DEFAULT 0,
    status ENUM('draft', 'published', 'archived') DEFAULT 'draft',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL
);

-- 评论表
CREATE TABLE comments (
    id INT AUTO_INCREMENT PRIMARY KEY,
    post_id INT NOT NULL,
    user_id INT NOT NULL,
    content TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

-- 插入示例数据
INSERT INTO categories (name, description) VALUES
    ('技术', '技术相关文章'),
    ('生活', '生活分享'),
    ('学习', '学习笔记');

INSERT INTO users (username, password, email) VALUES
    ('admin', 'hashed_password', 'admin@example.com'),
    ('zhangsan', 'hashed_password', 'zhangsan@example.com');

INSERT INTO posts (title, content, author_id, category_id, status) VALUES
    ('MySQL 入门教程', '这是 MySQL 入门教程的内容...', 1, 1, 'published'),
    ('学习笔记', '今天学习了数据库基础知识', 2, 3, 'published');

INSERT INTO comments (post_id, user_id, content) VALUES
    (1, 2, '很好的教程,学到了很多!'),
    (2, 1, '继续加油!');

项目二:电商订单系统

设计一个电商订单系统,包含商品、订单、订单详情等表。

查看完整代码
-- 创建数据库
CREATE DATABASE ecommerce;
USE ecommerce;

-- 商品表
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(200) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    stock INT DEFAULT 0,
    category VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 用户表
CREATE TABLE customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    phone VARCHAR(20),
    address TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 订单表
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    status ENUM('pending', 'confirmed', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
);

-- 订单详情表
CREATE TABLE order_items (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id)
);

-- 复杂查询示例:查询某个用户的所有订单及详情
SELECT
    o.id as order_id,
    o.order_date,
    o.total_amount,
    o.status,
    p.name as product_name,
    oi.quantity,
    oi.price
FROM orders o
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE o.customer_id = 1
ORDER BY o.order_date DESC;

学习建议

💡 掌握 AI 工具

学习使用 MySQL 9.x 的 AI 查询优化器和自然语言查询功能,这将大大提升开发效率。

🤖 机器学习集成

了解如何将机器学习模型集成到数据库中,实现实时预测和智能分析。

☁️ 云原生架构

学习 Kubernetes 和 Serverless 架构下的 MySQL 部署和管理,这是未来的主流方向。

🔒 安全第一

深入学习零信任架构、端到端加密和行级安全策略,确保数据安全。

📊 实时分析

掌握 HTAP 混合事务分析技术,同时支持事务处理和实时数据分析。

🎯 性能优化

利用 AI 工具进行性能分析和优化,自动化索引推荐和查询调优。

🌐 多语言支持

学习 JavaScript 存储过程和新的函数式编程特性,扩展开发能力。

📚 持续学习

关注 MySQL 官方文档和社区动态,新功能更新速度加快,需要持续跟进。