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)
