MySQL 发展历程

MySQL 由瑞典 MySQL AB 公司开发,于 2008 年被 Sun Microsystems 收购,2009 年随 Sun 被 Oracle 收购。作为最流行的开源关系型数据库,MySQL 经历了多个重要版本的迭代,每个版本都带来了关键的新特性和性能提升。

gantt
    title MySQL 版本演进时间线
    dateFormat YYYY
    axisFormat %Y
    section 早期
    MySQL 1.0 诞生         :1995-01-01, 0d
    MySQL 3.23 发布       :2000-01-01, 0d
    section 发展
    MySQL 4.0 发布        :2003-01-01, 0d
    MySQL 5.0 发布        :2005-01-01, 0d
    MySQL 5.5 发布        :2010-01-01, 0d
    MySQL 5.6 发布        :2013-01-01, 0d
    MySQL 5.7 发布        :2015-01-01, 0d
    section 现代
    MySQL 8.0 发布        :2018-01-01, 0d
    MySQL 8.4 LTS         :2024-04-01, 0d
    MySQL 9.0 发布        :2024-10-01, 0d

1. MySQL 3.23 (2000年) - 奠定基础

-- MySQL 3.23 是首个广泛使用的稳定版本

-- 主要特性:
-- 1. 引入 MyISAM 存储引擎 (取代 ISAM)
-- 2. 支持 FULLTEXT 全文索引
-- 3. 首次支持事务 (通过 BerkeleyDB 引擎)
-- 4. 复制功能正式推出
-- 5. 支持 ANSI SQL99 语法

-- 解决的问题:
-- - 早期版本功能简单,无法满足复杂应用需求
-- - 缺乏全文搜索能力
-- - 没有复制功能,无法实现高可用

-- 创建 MyISAM 表并使用全文索引
CREATE TABLE articles (
    id INT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT INDEX ft_title_content (title, content)
) ENGINE=MyISAM;

SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('MySQL' IN NATURAL LANGUAGE MODE);

2. MySQL 4.0 - 性能飞跃

-- MySQL 4.0 (2003年) 是里程碑版本

-- 主要特性:
-- 1. 引入 InnoDB 存储引擎 (事务支持)
-- 2. 查询缓存 (Query Cache) 大幅提升性能
-- 3. 支持 UNION 语句
-- 4. 支持 RENAME TABLE
-- 5. 改进了 BLOB 类型的处理

-- 解决的问题:
-- - MyISAM 不支持事务,无法保证数据一致性
-- - 重复查询浪费资源,查询缓存解决此问题
-- - 无法进行复杂的 SQL 查询

-- 使用 InnoDB 引擎和事务
CREATE TABLE accounts (
    id INT PRIMARY KEY,
    balance DECIMAL(15,2)
) ENGINE=InnoDB;

START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

-- 查看查询缓存状态
SHOW VARIABLES LIKE 'query_cache_type';

3. MySQL 5.0 - 企业级功能

-- MySQL 5.0 (2005年) 正式进入企业级市场

-- 主要特性:
-- 1. 存储过程 (Stored Procedures)
-- 2. 触发器 (Triggers)
-- 3. 视图 (Views)
-- 4. 游标 (Cursors)
-- 5. INFORMATION_SCHEMA 系统数据库
-- 6. 支持XA事务

-- 解决的问题:
-- - 缺少存储过程,复杂业务逻辑需在应用层实现
-- - 缺乏触发器,无法实现自动化数据维护
-- - 无法创建视图,复杂查询无法封装

-- 创建存储过程
DELIMITER //
CREATE PROCEDURE get_user_count()
BEGIN
    SELECT COUNT(*) as total_users FROM users;
END //
DELIMITER ;

CALL get_user_count();

-- 创建触发器
DELIMITER //
CREATE TRIGGER before_insert_users
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    SET NEW.created_at = NOW();
END //
DELIMITER ;

-- 创建视图
CREATE VIEW user_stats AS
SELECT 
    COUNT(*) as total,
    AVG(age) as avg_age
FROM users;

4. MySQL 5.5 - 稳定与性能

-- MySQL 5.5 (2010年) 成为主流稳定版本

-- 主要特性:
-- 1. InnoDB 成为默认存储引擎
-- 2. 半同步复制 (Semi-Synchronous Replication)
-- 3. 改进的分区表功能
-- 4.  SIGNAL 和 RESIGNAL 语句 (错误处理)
-- 5. 改进了 UTF-8 支持 (utf8mb4)
-- 6. 多核 CPU 性能优化

-- 解决的问题:
-- - MyISAM 不支持并发写入和数据恢复
-- - 复制延迟高,数据一致性无法保证
-- - UTF-8 只支持3字节,中文emoji受限

-- 启用半同步复制 (需要安装插件)
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

-- 使用 utf8mb4 字符集
CREATE TABLE messages (
    id INT PRIMARY KEY,
    content VARCHAR(1000) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
) ENGINE=InnoDB;

-- 分区表示例
CREATE TABLE logs (
    id INT,
    log_date DATETIME,
    message TEXT
) ENGINE=InnoDB
PARTITION BY RANGE (YEAR(log_date)) (
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION pfuture VALUES LESS THAN MAXVALUE
);

5. MySQL 5.6 - 大数据时代

-- MySQL 5.6 (2013年) 适配大数据场景

-- 主要特性:
-- 1. 索引下推优化 (Index Condition Pushdown)
-- 2. MRR (Multi-Range Read) 优化
-- 3. 全文索引支持 InnoDB
-- 4. 实时监控 InnoDB 性能
-- 5. 改进的优化器
-- 6. 延迟复制 (Delayed Replication)

-- 解决的问题:
-- - 大表查询性能差
-- - InnoDB 不支持全文索引
-- - 误操作无法快速恢复

-- EXPLAIN 查看执行计划
EXPLAIN SELECT * FROM users WHERE age > 25;

-- InnoDB 全文索引
CREATE TABLE articles (
    id INT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT INDEX ft_content (content)
) ENGINE=InnoDB;

SELECT * FROM articles
WHERE MATCH(content) AGAINST('database' IN NATURAL LANGUAGE MODE);

-- 延迟复制 (延迟10分钟)
STOP SLAVE;
CHANGE MASTER TO MASTER_DELAY = 600;
START SLAVE;

-- 监控 InnoDB 状态
SHOW ENGINE InnoDB STATUS;

-- 查看慢查询
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

6. MySQL 5.7 - JSON 时代

-- MySQL 5.7 (2015年) 原生支持 JSON

-- 主要特性:
-- 1. 原生 JSON 数据类型和函数
-- 2. 虚拟列 (Generated Columns)
-- 3. 多源复制 (Multi-Source Replication)
-- 4. 改进的 GIS 地理位置支持
-- 5. 增强的 InnoDB 性能
-- 6. Sys schema 系统监控视图
-- 7. 支持 JSON 索引 (通过虚拟列)

-- 解决的问题:
-- - NoSQL 数据库冲击,需支持灵活 schema
-- - JSON 数据存储和查询困难
-- - 需要从多个数据源聚合数据

-- JSON 数据类型
CREATE TABLE user_configs (
    id INT PRIMARY KEY,
    user_id INT,
    config JSON
);

INSERT INTO user_configs (user_id, config)
VALUES(1, '{"theme": "dark", "notifications": true, "language": "zh"}');

SELECT 
    user_id,
    config->>'$.theme' as theme
FROM user_configs;

SELECT JSON_EXTRACT(config, '$.notifications') FROM user_configs;

-- 虚拟列索引
CREATE TABLE products (
    id INT PRIMARY KEY,
    specs JSON,
    price INT,
    category VARCHAR(50) GENERATED ALWAYS AS (specs->>'$.category') STORED,
    INDEX idx_category (category)
);

-- GIS 地理位置
CREATE TABLE locations (
    id INT,
    name VARCHAR(100),
    location POINT,
    SPATIAL INDEX (location)
) ENGINE=InnoDB;

INSERT INTO locations VALUES(1, '天安门', ST_GeomFromText('POINT(116.397 39.909)'));

7. MySQL 8.0 - 全面进化

-- MySQL 8.0 (2018年) 里程碑版本

-- 主要特性:
-- 1. 窗口函数 (Window Functions)
-- 2. 公共表表达式 (CTE / WITH RECURSIVE)
-- 3. 隐藏索引 (Invisible Indexes)
-- 4. 降序索引 (Descending Indexes)
-- 5. 角色 (Roles) 权限管理
-- 6. 改进了 JSON 函数
-- 7. 支持 UTF8MB4 字符集默认
-- 8. 增强的 GIS 功能 (GeoJSON)
-- 9. 字典数据 (Data Dictionary)

-- 解决的问题:
-- - 复杂分析查询需要 UNION,效率低
-- - 递归查询需要程序模拟
-- - 无法在线测试索引效果
-- - 权限管理不够灵活

-- 窗口函数
SELECT 
    name,
    department,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank,
    SUM(salary) OVER (ORDER BY salary) as running_total
FROM employees;

-- 递归 CTE (查询组织架构)
WITH RECURSIVE org_tree AS (
    SELECT id, name, manager_id, 1 as level
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, ot.level + 1
    FROM employees e
    JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT * FROM org_tree;

-- 隐藏索引测试
CREATE INDEX idx_test ON users(email) INVISIBLE;
ALTER INDEX idx_test VISIBLE;

-- 角色权限管理
CREATE ROLE 'app_read', 'app_write';
GRANT SELECT ON mydb.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';
GRANT 'app_read', 'app_write' TO 'user1'@'localhost';
SET DEFAULT ROLE 'app_read' FOR 'user1'@'localhost';

8. MySQL 8.4 LTS - 长期支持

-- MySQL 8.4 (2024年4月) LTS 长期支持版本

-- 主要特性:
-- 1. 性能提升 (InnoDB 引擎优化)
-- 2. JSON 数组增强
-- 3. 改进的复制功能
-- 4. 增强的安全特性
-- 5. 更好的 UTF-8 支持 (UTF8MB4 改进)
-- 6. 窗口函数性能优化
-- 7. 改进的审计日志

-- 解决的问题:
-- - 企业需要稳定可靠的长期支持版本
-- - JSON 处理效率需要提升
-- - 需要更好的安全合规性

-- 查看版本信息
SELECT VERSION();
SHOW VARIABLES LIKE 'version_comment';

-- JSON 数组函数增强
SELECT JSON_ARRAYAGG(column) FROM table;
SELECT JSON_OBJECTAGG(key, value) FROM table;

-- 检查字符集
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

9. MySQL 9.0 - AI 时代

-- MySQL 9.0 (2024年) 最新版本

-- 主要特性:
-- 1. 原生向量数据类型 (Vector Type)
-- 2. AI 查询优化器 (AI Query Optimizer)
-- 3. HNSW 索引支持向量搜索
-- 4. JavaScript 存储过程
-- 5. LATERAL JOIN 支持
-- 6. 物化视图 (Materialized Views)
-- 7. 增强的 JSON 处理
-- 8. 更好的云原生支持
-- 9. ARM64 架构优化

-- 解决的问题:
-- - AI/ML 应用需要向量数据库能力
-- - 传统 SQL 无法高效处理向量相似性搜索
-- - 需要更智能的查询优化

-- 向量数据类型
CREATE TABLE embeddings (
    id INT PRIMARY KEY,
    doc_text TEXT,
    vector VECTOR(768),
    INDEX idx_vector (vector) INDEX_TYPE = 'HNSW'
);

-- 向量相似性搜索
SELECT id, doc_text,
    VECTOR_DISTANCE(vector, '[0.1, 0.2, ...]', 'cosine') as distance
FROM embeddings
ORDER BY distance
LIMIT 5;

-- JavaScript 存储过程
DELIMITER //
CREATE PROCEDURE analyze_data()
LANGUAGE JAVASCRIPT AS
$$
    var result = session.sql('SELECT COUNT(*) FROM users').execute();
    return 'Total users: ' + result.fetchOne()[0];
$$ //
DELIMITER ;

-- 物化视图
CREATE MATERIALIZED VIEW sales_summary
REFRESH EVERY 1 HOUR AS
SELECT 
    DATE(order_date) as date,
    COUNT(*) as total_orders,
    SUM(amount) as total_amount
FROM orders
GROUP BY DATE(order_date);

-- LATERAL JOIN
SELECT u.name, latest_orders.*
FROM users u
LEFT JOIN LATERAL (
    SELECT order_id, total
    FROM orders WHERE user_id = u.id
    ORDER BY order_date DESC LIMIT 3
) AS latest_orders ON TRUE;

-- AI 优化提示
SELECT /*+ AI_OPTIMIZE */ * FROM large_table
WHERE complex_condition = 1;

版本选择建议

-- 版本选择指南

-- 生产环境推荐:
-- - MySQL 8.4 LTS: 稳定可靠,适合长期项目
-- - MySQL 8.0.35+: 如果需要窗口函数/CTE
-- - MySQL 5.7: 遗留系统维护 (不推荐新项目)

-- 开发/测试环境:
-- - MySQL 9.x: 测试最新特性,为迁移做准备

-- 需要向量搜索/AI 应用:
-- - MySQL 9.0+

-- 查看当前版本
SELECT 
    @@version as version,
    @@version_comment as edition;

-- 检查支持的特性
SHOW VARIABLES LIKE 'have_%';
SHOW ENGINES;