MySQL 8.0 特性使用案例介绍(二)

来源:这里教程网 时间:2026-03-01 18:33:49 作者:

MySQL 8.0 带来了许多新特性和改进,这些改进可以显著提升数据库的性能、安全性和易用性。以下是一些   MySQL 8.0   特性的使用案例 ,适用于 MySQL 8.0 以及更高版本。

2、  不可见索引(Invisible Indexes

MySQL 支持隐形索引,即优化器不使用的索引。此功能适用于除主键(无论是显式还是隐式)以外的其他索引。

在生产环境中测试新索引的影响时非常有用,可以先将索引设置为不可见,然后在确认性能改善后使其可见。

1 )、创建不可见索引         CREATE TABLE t1 (            i INT,            j INT,            k INT,            INDEX i_idx (i) INVISIBLE         ) ENGINE = InnoDB;         CREATE INDEX j_idx ON t1 (j) INVISIBLE;         ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE;

2 )、更改 现有索引的可见性

    要更改现有索引的可见性,可以使用VISIBLE INVISIBLE 关键字与 ALTER TABLE ... ALTER INDEX 操作一起使用:         ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE;         ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;  

3、  公用表达式索引(Virtual and Invisible Columns

可以在表上创建基于表达式或虚拟列的索引,这对于某些类型的查询优化非常有用。

创建一个基于两个列的表达式索引         CREATE TABLE transactions (              id INT AUTO_INCREMENT PRIMARY KEY,              price DECIMAL(10,2),              quantity INT,              INDEX idx_price_quantity (price * quantity) -- 表达式索引         );

4、  角色管理

1 )、 痛点

假设公司有100 个新员工,都要开通数据库的 只读权限 。传统做法是给每个用户单独授权,费时费力。

2 )、 解决方案:角色

步骤1 :创建一个角色 read_only ,赋予它查询权限。         CREATE ROLE 'read_only';         GRANT SELECT ON company_db.* TO 'read_only';

步骤2 :把角色分配给所有新员工。         GRANT 'read_only' TO 'user1'@'localhost', 'user2'@'localhost', ...;

3 )、 效果

     员工自动拥有角色下的所有权限

     修改权限时只需改角色,无需逐个用户调整

5、  原子DDL 操作

1 )、 解决的问题

旧版MySQL 执行 DDL (如修改表结构)时,如果中途出错,可能留下 半成品 ,导致表损坏。

2 )、 原子DDL 的效果

     执行DDL 时,要么完全成功,要么完全回滚

类似事务的 原子性 ,保证数据安全

如果某个表不存在,DROP TABLE 将会返回一个错误,此时无论使用哪种存储引擎,都不会产生任何操作。以下是一个示例,由于表 t2 不存在, DROP TABLE 语句将会失败:         mysql> CREATE TABLE t1 ( id  INT);         mysql> DROP TABLE t1, t2;         ERROR 1051 (42S02): Unknown table ' wg_db .t2'         mysql> SHOW TABLES;         +----------------+         | Tables_in_test |         +----------------+         | t1             |         +----------------+

在支持原子 DDL 之前, DROP TABLE 会返回一个错误,但是仍然会删除存在的表:         mysql> CREATE TABLE t1 ( id INT);         mysql> DROP TABLE t1, t2;         ERROR 1051 (42S02): Unknown table ' wg_db .t2'         mysql> SHOW TABLES;         Empty set (0.00 sec)

 

相关推荐