本文共 2022 字,大约阅读时间需要 6 分钟。
MySQL 8.0 引入了许多新功能和改进特性,值得数据库管理员和开发人员关注和掌握。以下是本次更新中最重要的特性解读:
MySQL 8.0 允许在创建索引时指定 desc
关键字,从而实现降序索引。这种方式可以在索引创建时直接指定排序规则,简化了对排序需求的配置。
示例:
create table t1(c1 int, c2 int, index idx_c1_c2(c1, c2 desc));
MySQL 5.7 及以前版本会在执行 group by
时对分组字段进行隐式排序,但从 MySQL 8.0 起,这一功能被移除。为了保持与其他数据库一致,用户需要在 group by
后手动添加 order by
子句来指定排序逻辑。
示例:
select count(*), c2 from t1 group by c2 order by c2;
新增支持隐藏索引功能,适用于以下场景:
隐藏索引的使用需注意:
示例:
create table t2(c1 int, c2 int, index idx_c1(c1), index idx_c2(c2) invisible);
新增支持在索引中使用函数运算后的值。这种方式可以优化查询性能,但需要在 where
条件中使用相同函数来确保一致性。
示例:
create index func_idx on t3((UPPER(c2)));
MySQL 8.0 增加了 NOWAIT
和 SKIP LOCKED
语法,允许查询不等待锁或跳过当前锁定状态。
NOWAIT
会立即报错而不是等待超时。SKIP LOCKED
会跳过当前锁定记录,返回其他未锁定数据。示例:
select * from t1 where c1 = 2 for update nowait;select * from t1 for update skip locked;
新增 innodb_dedicated_server
参数,可根据服务器空闲性能自动配置 InnoDB 缓冲池和日志文件大小。
注意事项:
新增动态变量 innodb_deadlock_detect
,默认开启。可以通过禁用该变量提高性能,但需谨慎以防死锁风险。
示例:
show variables like '%innodb_deadlock_detect%';
MySQL 8.0 默认在数据目录下创建两个 UNDO 表空间,独立于系统表空间,不再使用旧表空间存储 UNDO 数据。
优势:
默认使用 binlog_expire_logs_seconds
参数,精确到秒。
示例:
show variables like '%binlog_expire_logs_seconds%';
新增窗口函数支持,可直接在查询结果中添加分析函数结果,而无需使用 group by
。
示例:
select c2, sum(c1) over (order by c1) as sum_c1 from t1;
MySQL 8.0 的默认字符集改为 UTF-8mb4,支持完整的 Unicode 符号。
注意事项:
MySQL 8.0 默认不再支持 MyISAM 存储引擎,所有系统表和数据字典表改为 InnoDB。
解决了自增变量持久化问题,确保变量值在重启后保持一致。
InnoDB 表的 DDL 操作支持事务完整性,成功或回滚。
示例:
drop table t1, t2; -- 8.0 版本会回滚操作
新增支持在线修改全局参数并持久化,通过 PERSIST
关键字将修改保存至配置文件。
示例:
set persist innodb_lock_wait_timeout=25;
以上是 MySQL 8.0 的主要新特性,未来版本的数据库管理和应用开发需要充分利用这些功能以提高效率和稳定性。
转载地址:http://vnbfk.baihongyu.com/