MySQL5.7 与 MySQL8.0的差异

本文概述了MySQL 8.0相较于5.7的主要改进,包括:UTF-8MB4字符集支持、JSON功能增强、表达式默认值、不可见索引、降序索引、功能键索引、公用表表达式、窗口函数、横向派生表、别名在DELETE语句中的应用、正则表达式支持、EXPLAINANALYZE分析和更新的INSERT语句规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL5.7 与 MySQL8.0的差异

MySQL8.0官网

字符集支持。 默认字符集已从 更改 latin1utf8mb4

JSON 增强。从MySQL 5.7.8 开始支持JSON,8.0对此进行增强。

**数据类型支持。**MySQL 现在支持在数据类型规范中使用表达式作为默认值。

优化器。

  • MySQL 现在支持不可见索引。优化器根本不使用不可见索引,但可以正常维护。默认情况下,索引是可见的。不可见索引可以测试删除索引对查询性能的影响,而无需进行破坏性更改,如果需要索引,则必须撤消该更改。该功能适用于主键以外的索引

    ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE;
    ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;
    
  • MySQL 现在支持降序索引:支持 InnoDB存储引擎, DESC在索引中定义不再被忽略,而是导致键值按降序存储。

  • MySQL 8.0.13 和更高版本支持创建索引表达式值而不是列值的功能索引键部分。功能键部分可以索引其他无法索引的值,例如 JSON值。

    -- 允许
    ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
    INDEX ((col1 + col2), (col3 - col4))
    INDEX (col1, col2)
    -- 不允许
    INDEX (col1 + col2, col3 - col4)
    INDEX ((col1), (col2))
    

公用表表达式。 MySQL 现在支持非递归和递归的公共表表达式。

WITH
  cte1 AS (SELECT a, b FROM table1),
  cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;
-- 递归
WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;

窗口函数。 MySQL 现在支持窗口函数,对于查询中的每一行,使用与该行相关的行执行计算。

<窗口函数> over (partition by <用于分组的列名>
                order by <用于排序的列名>)

横向派生表。 现在可以在派生表前面加上 关键字,以指定允许在同一子句LATERAL中引用(依赖)前面表的列。

SELECT
  salesperson.name,
  max_sale.amount,
  max_sale_customer.customer_name
FROM
  salesperson,
  -- calculate maximum size, cache it in transient derived table max_sale
  LATERAL
  (SELECT MAX(amount) AS amount
    FROM all_sales
    WHERE all_sales.salesperson_id = salesperson.id)
  AS max_sale,
  -- find customer, reusing cached maximum size
  LATERAL
  (SELECT customer_name
    FROM all_sales
    WHERE all_sales.salesperson_id = salesperson.id
    AND all_sales.amount =
        -- the cached maximum size
        max_sale.amount)
  AS max_sale_customer;
  
SELECT
  salesperson.name,
  max_sale.amount,
  max_sale.customer_name
FROM
  salesperson,
  -- find maximum size and customer at same time
  LATERAL
  (SELECT amount, customer_name
    FROM all_sales
    WHERE all_sales.salesperson_id = salesperson.id
    ORDER BY amount DESC LIMIT 1)
  AS max_sale;

单表 DELETE 语句中的别名。 在 MySQL 8.0.16 及更高版本中,单表 DELETE语句支持使用表别名。

正则表达式支持。

解释分析语句。 MySQL 8.0.18 引入了EXPLAIN ANALYZE,它运行一个语句并产生 EXPLAIN输出以及时间和额外的、基于迭代器的信息,关于优化器的期望如何与实际执行相匹配。

EXPLAIN ANALYZE SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c2)\G

带有 ON DUPLICATE KEY UPDATE 的行和列别名。

-- 违反唯一索引时执行表达式
INSERT INTO t1 (a,b,c) VALUES (1,1,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
-- MySQL 8.0.19  
INSERT INTO t1 (a,b,c) VALUES (1,1,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
### 升级 MySQL 5.7MySQL 8.0 的迁移指南 升级 MySQL 数据库版本是一个复杂的过程,涉及多个步骤以确保数据一致性、兼容性性能优化。以下是关于从 MySQL 5.7 升级到 MySQL 8.0 迁移过程中需要注意的关键点以及兼容性变更的内容。 #### 兼容性变化概述 MySQL 8.0 引入了许多新功能改进,但也有一些不向后兼容的变化。这些变化可能会影响现有的数据库配置、查询逻辑或应用程序行为[^2]。因此,在执行升级之前,建议仔细阅读官方文档并进行全面测试。 - **SQL 模式更改**: 默认 SQL 模式的调整可能导致某些语句不再被接受。例如,默认情况下启用了 `ONLY_FULL_GROUP_BY`[^3]。 - **存储引擎更新**: InnoDB 是唯一支持事务的存储引擎,并且 MyISAM 不再推荐用于生产环境中的核心表结构[^4]。 - **密码验证策略增强**: 新增更严格的密码强度校验机制,这可能会阻止旧版客户端连接成功[^5]。 - **字符集默认值改变**: 字符串列现在使用 utf8mb4 编码作为标准设置而不是之前的 latin1 或者简单的 utf8[^6]。 #### 实际操作流程 为了顺利完成从 MySQL 5.78.0 的过渡,请遵循如下指导原则: 1. 备份现有数据库实例及其所有相关文件夹内容以防万一出现问题可以迅速恢复原始状态[^7]。 ```bash mysqldump --all-databases > all_dbs_backup.sql ``` 2. 安装最新稳定发行版的 MySQL Server 软件包于目标服务器上同时保留当前运行的服务不变直到确认无误为止[^8]。 3. 使用 mysql_upgrade 工具来修复权限表项以及其他必要的元数据对象同步工作以便适应新版特性需求[^9]。 ```sql mysql_upgrade -u root -p; ``` 4. 测试整个应用系统能否正常运转并无明显错误提示后再正式切换至新的数据库服务端口之上[^10]。 ```python import pymysql.cursors connection = pymysql.connect(host='localhost', user='root', password='your_password', cursorclass=pymysql.cursors.DictCursor) try: with connection.cursor() as cursor: sql = "SHOW VARIABLES LIKE 'version';" cursor.execute(sql) result = cursor.fetchone() finally: connection.close() print(result['Value']) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值