目录
前言
MySQL是一款开源、免费、快速稳定的关系型数据库,被广泛地应用在大量的Web应用程序中。
当执行一条sql的时候,会经过以下流程:
关于两个不同版本的区别,可参考如下:
1、MySQL版本-- 》5版本
发布于2005年。
以下是MySQL 5的一些主要特点和功能:
1.1、InnoDB存储引擎
MySQL 5引入了InnoDB存储引擎作为默认的事务引擎,提供了ACID(原子性、一致性、隔离性和持久性)事务支持,以及行级锁定和多版本并发控制(MVCC)等高级特性。
1.2、存储过程和触发器
MySQL 5引入了存储过程和触发器的支持,使得可以在数据库中使用更复杂的业务逻辑和数据处理操作。
1.3、视图
MySQL 5引入了视图的支持,允许用户创建虚拟表,从而简化查询和数据访问。
1.4、增强的查询优化器
MySQL 5对查询优化器进行了改进,提供了更好的查询执行计划生成和查询性能。
1.5、增强的索引支持
MySQL 5引入了更多类型的索引,包括全文索引、B-Tree索引和哈希索引,以提高查询效率。
1.6、外键支持
MySQL 5开始支持外键约束,使得在多表关联查询和数据完整性方面更加灵活和方便。
1.7、分区表和分布式查询
MySQL 5引入了分区表的支持,可以将大型表分割成若干个子表,以提高查询和维护的效率。此外,MySQL 5还引入了分布式查询的功能,允许在多个MySQL实例之间进行查询操作。
注意: MySQL 5是一个大版本,如MySQL 5.0、MySQL 5.1、MySQL 5.5等。每个小版本都对功能和性能进行了不同程度的改进和优化。
2、MySQL版本-- 》8版本
MySQL 8于2018年发布,引入了众多新功能和改进,以提供更高性能、更强安全性和更丰富的功能。
2.1、性能
MySQL 8 采用了新版InnoDB存储引擎,具有更好的性能表现。官方表示MySql 8.0的速度要比MySql5.7快2倍,特别是在高并发与大数据的环境下,其性能迅速提升,支持高级功能如JSON、空间索引和全文索引,从而可以提供更好的查询体验。
InnoDB 引擎在 8.x 中默认启用 多线程日志刷盘 和 动态缓冲池调整,显著提升写入性能。
2.2、字符编码改变
从MYSQL8.0开始,使用utfmb4作来MySQL的默认字符集,并支持Unicode 9 ,默认字符集将从 latin1 改为 utf8mb4,默认定序将从latin1_swedish_ci 改为 utf8mb4_800_ci_ai;
支持存储更广泛的Unicode字符,包括表情符号和特殊字符等。
2.3、持久化保存
MySQL8.0 新增 SET PERSIST 的命令,该命令的配置值保存到数据目录下的mysqld-auto.cnf文件中,待重启后,读取该文件,用其中的配置覆盖缺省的配置文件,补充了SET GLOBAL 命令只能临时生效的不足;
2.4、隐藏索引和降序索引
可以将索引通过命令设置未隐藏或显示。对于被隐藏的索引,它不会被查询优化器所使用,我们可以使用这一功能,对相关的查询进行性能调试,通过 隐藏 或 显示,分析数据库性能差异的原因,同时也可以去除无效的索引。
1:通过
"ALTER INDEX ... INVISIBLE"
可临时禁用索引进行性能调试。2: 降序索引 优化了
"ORDER BY ... DESC"
查询的效率。
-- 降序索引
CREATE INDEX idx_salary_desc ON employees (salary DESC);
-- 隐藏索引(可用于测试索引效果)
ALTER TABLE employees ALTER INDEX idx_name INVISIBLE;
3、MySQL 5和MySQL 8的区别
以下是MySQL 5和MySQL 8之间的一些主要区别:
3.1、JSON支持:
MySQL 5对JSON支持较弱,只能存储和查询JSON字符串,而MySQL 8引入了更强大的JSON功能,包括对JSON文档的索引和查询功能。
MySQL 8 提供 原生 JSON 数据类型 和丰富的操作函数(如 “JSON_EXTRACT”、“JSON_SET”),支持索引加速查询。
如下图所示:
-- MySQL 5:需手动解析字符串
SELECT * FROM users WHERE JSON_UNQUOTE(JSON_EXTRACT(profile, '$.age')) > 30;
-- MySQL 8:直接使用路径查询
SELECT * FROM users WHERE profile->"$.age" > 30;
-- MySQL 8.0 JSON示例
CREATE TABLE products (
id INT PRIMARY KEY,
details JSON
);
INSERT INTO products VALUES
(1, '{"name": "Laptop", "specs": {"cpu": "i7", "ram": "16GB"}}');
SELECT
id,
details->>"$.name" as product_name,
details->>"$.specs.cpu" as cpu
FROM products;
3.2、插件化架构:
MySQL 8引入了插件式存储引擎架构,使得用户可以根据具体需求选择不同的存储引擎,比如InnoDB、MyISAM等。而MySQL 5则相对较为有限,大多数情况下使用的是InnoDB引擎。
3.3、性能提升
MySQL 8在性能方面进行了许多改进,包括更好的查询优化器、索引算法的改进、并行查询等,从而提供更高的查询速度和吞吐量。
3.4、安全增强
MySQL 8引入了许多安全增强功能,如更加严格的密码策略、默认启用的SSL/TLS支持、资源组和权限控制的增强等,以提供更高的数据安全性。
3.5、支持的SQL语法
MySQL 8增加了对一些新的SQL语法的支持,如窗口函数和CTE(公共表达式,即WITH语句),使得复杂查询更加方便和灵活。
-- MySQL 8.0窗口函数示例
SELECT
employee_name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;
-- MySQL 8.0 CTE示例
WITH dept_stats AS (
SELECT
department,
AVG(salary) as avg_salary
FROM employees
GROUP BY department
)
SELECT * FROM dept_stats WHERE avg_salary > 5000;
3.6、Unicode支持
MySQL 8默认使用utf8mb4字符集,支持存储更广泛的Unicode字符,包括表情符号和特殊字符等。
-- MySQL 8.0默认支持完整Unicode
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100) -- 默认utf8mb4,支持emoji等
);
3.7、索引算法改进
MySQL 8引入了更高效的索引算法(R-tree和B-tree索引的改进),从而提升空间数据类型和文本数据类型的查询性能。
4、配置及兼容性
4.1、驱动与连接配置
驱动类:MySQL 5使用com.mysql.jdbc.Driver,而MySQL 8需改用com.mysql.cj.jdbc.Driver。
连接URL:MySQL 8需在JDBC URL中指定时区参数(如?serverTimezone=UTC),否则可能报错
4.2、移除特性
MySQL 8.0移除了一些旧特性,如:
不再支持
password()
函数
总结
MySQL 8.0相比5.0在性能、功能、安全性和SQL标准兼容性方面都有显著提升,特别是窗口函数、CTE和JSON支持使得复杂查询和半结构化数据处理更加方便。
参考文章: