首页 > 数据库 > MySQL > MySQL 8.0 特性使用案例介绍(二)
MySQL 8.0 带来了许多新特性和改进,这些改进可以显著提升数据库的性能、安全性和易用性。以下是一些 MySQL 8.0 特性的使用案例 ,适用于 MySQL 8.0 以及更高版本。
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;
可以在表上创建基于表达式或虚拟列的索引,这对于某些类型的查询优化非常有用。
创建一个基于两个列的表达式索引
CREATE TABLE transactions (
id INT AUTO_INCREMENT PRIMARY KEY,
price DECIMAL(10,2),
quantity INT,
INDEX idx_price_quantity (price * quantity) -- 表达式索引
);
( 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 )、 效果
员工自动拥有角色下的所有权限
修改权限时只需改角色,无需逐个用户调整
( 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)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30310891/viewspace-3100582/ ,如需转载,请注明出处,否则将追究法律责任。