① 隐藏索引
隐藏索引不会被优化器使用,但它仍然需要进行维护
主要应用于软删除(先将索引隐藏,当最终确认系统不会受到影响才将其彻底删除)、灰度发布(为了测试某些功能先将索引隐藏,经测试索引有效才将其设置为可见)等场景。
mysql> show index from tableName;
② 降序索引
MySQL8.0之前,索引也可以反向扫描来实现降序效果,但会有一定的性能损耗。利用降序索引可以进行更高效的正向扫描。降序索引使得优化器能够同时使用不同列上的升序方向和降序降序方向索引。
例如:
CREATE TABLE t (
c1 INT, c2 INT,
INDEX idx1 (c1 ASC, c2 ASC),
INDEX idx2 (c1 ASC, c2 DESC),
INDEX idx3 (c1 DESC, c2 ASC),
INDEX idx4 (c1 DESC, c2 DESC)
);
优化器可以为ORDER BY子句进行正向索引扫描排序而不用性能较差的filesort排序:
ORDER BY c1 ASC, c2 ASC – optimizer can use idx1
ORDER BY c1 DESC, c2 DESC – optimizer can use idx4
ORDER BY c1 ASC, c2 DESC – optimizer can use idx2
ORDER BY c1 DESC, c2 ASC – optimizer can use idx3
只有InnoDB引擎索引支持降序索引,且只支持BTREE降序索引。
③ 函数索引
MySQL 8.0支持函数索引(functional key parts),也就是可以将表达式的值作为索引的内容,而不只是列值或列值前缀。 将函数作为索引键可以用于索引那些没有在表中直接存储的内容。例如:
CREATE TABLE t1 (col1 INT, col2 INT, INDEX func_index ((ABS(col1))));
CREATE INDEX idx1 ON t1 ((col1 + col2));
CREATE INDEX idx2 ON t1 ((col1 + col2), (col1 - col2), col1);
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
按照功能划分,可以把MySQL支持的窗口函数分为如下几类:
序号函数:row_number() / rank() / dense_rank()
分布函数:percent_rank() / cume_dist()
前后函数:lag() / lead()
头尾函数:first_val() / last_val()
其他函数:nth_value() / nfile()
函数名([expr]) over子句
其中,over是关键字,用来指定函数执行的窗口范围,如果后面括号中什么都不写,则意味着窗口包含满足where条件的所有行,窗口函数基于所有行进行计算;如果不为空,则支持以下四种语法来设置窗口:
window_name:给窗口指定一个别名,如果SQL中涉及的窗口较多,采用别名可以看起来更清晰易读。上面例子中如果指定一个别名w,则改写如下:
select * from
(
select row_number() over w as row_num,
order_id,user_no,amount,create_date
from order_tab
WINDOW w AS (partition by user_no order by amount desc)
) t ;
partition子句:窗口按照那些字段进行分组,窗口函数在不同的分组上分别执行。上面的例子就按照用户id进行了分组。在每个用户id上,按照order by的顺序分别生成从1开始的顺序编号。
order by子句:按照哪些字段进行排序,窗口函数将按照排序后的记录顺序进行编号。可以和partition子句配合使用,也可以单独使用。上例中二者同时使用,如果没有partition子句,则会按照所有用户的订单金额排序来生成序号。
frame子句:frame是当前分区的一个子集,子句用来定义子集的规则,通常用来作为滑动窗口使用。
集成数据字典
支持原子DDL语句
① 创建用户和用户授权的命令需要分开执行:
mysql> create user ‘tony’@’%’ identified by ‘Tony@2018’;
mysql> grant all privileges on . to ‘tony’@’%’;
② 认证插件的更新
mysql8.0中默认的身份认证插件是:
caching_sha2_password 替代了之前的 mysql_native_password
适配旧的客户端两个方法:
1、通过修改配置文件中default-authentication-plugin=mysql_native_password
2、修改mysql.user表
alter user ‘xxx’@’%’ identified with mysql_native_password by ‘xxxxxxxx’
③ 密码管理
password_history = 3 ; 新密码不能和前面三次的密码相同
password_reuse_interval = 90 ; 新密码不能和前面九十天内使用的密码相同
password_require_current = on ; 默认为off;为on时 修改密码需要用户提供当前密码
mysql> set persist xxxx=bbb , 使用set persist可以使设置的配置永久生效
① 非递归CTE
② 递归CTE
WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
1
union
2
union
3
union
4
union
5
③ 递归限制
限制递归次数的参数:cte_max_recursion_depth=1001
限制sql最长执行时间: max_execution_time=0 (0表示无限制)