文章目录
- 零、前言
- 一、练习题目
- 二、SQL思路
- SQL进阶-隐藏索引
- 初始化数据
- 解法
- 模拟索引软删除
- 模拟灰度发布
- 答案
- 三、参考
零、前言
今天是学习 SQL 打卡的第 13 天,每天我会提供一篇文章供群成员阅读
希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。
虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
今天的学习内容是:SQL进阶-索引的隐藏索引
一、练习题目
题目链接 | 难度 |
SQL进阶-索引的隐藏索引 | ★★★☆☆ |
二、SQL思路
SQL进阶-隐藏索引
初始化数据
解法
要求处理:
- 四个选项,选择一个正确答案
分析:
- 这是一个比较新的知识点,MySQL 数据库默认创建的索引都是可见的,MySQL 8.x才开始支持隐藏索引,意思如字面的含义,先把索引隐藏,这样索引就失效了,但也能快速显示索引。
- 适合的场景:软删除和灰度发布。
软删除最佳实践:将待删除的索引设置为隐藏索引,隐藏索引对查询优化器不可见,等确认隐藏的索引对系统不影响,再删除索引。如果隐藏索引对系统有影响了,快速把索引设置为可见索引。
灰度发布最佳实践:创建索引时,把索引设置为隐藏索引,修改查询优化器的开关(隐藏索引对查询优化器可见),通过EXPLAIN对索引进行测试,如果隐藏索引有效果,再把索引设置为可见索引,灰度发布成功。
- 已存在的索引,要变为隐藏索引的语法:
ALTER TABLE table_name ALTER INDEX index_name INVISIBLE;
- 把隐藏索引设置为可见索引的语法:
ALTER TABLE table_name ALTER INDEX index_name VISIBLE;
- 创建索引时,直接把索引创建为隐藏索引的语法:
ALTER TABLE table_name
ADD INDEX
[index_name] (column_name [length])
INVISIBLE
或
CREATE INDEX index_name
ON table_name (column_name [length])
INVISIBLE
创建隐藏索引比创建普通的索引,就是在末尾多了一个关键字INVISIBLE。
模拟索引软删除
- 先创建普通索引,查看索引是否有创建成功
- 用explain 解析sql语句是否索引有生效
- 把普通索引设置为隐藏索引
- 用explain 解析sql语句,看索引是否隐藏,不会生效
- 查看下这时候表的索引情况
- 假装隐藏索引导致系统异常,需要快速恢复
- 查看下这时候表的索引情况
- 用explain 解析sql语句,看索引是否重新生效
- 假装隐藏索引不影响系统,删除索引
- 查看下这时候表的索引情况
模拟灰度发布
- 创建索引时,把索引设置为隐藏索引
- 查看下这时候表的索引情况
- 用explain 解析sql语句是否索引有生效
修改查询优化器的开关(隐藏索引对查询优化器可见)
重点是这个set session :设置的会话变量仅限于当前连接(当前会话)。当前连接断开后,其设置的所有会话变量均失效
- 用explain 解析sql语句是否索引有生效,索引生效了。
- 如果隐藏索引有效果,再把索引设置为可见索引,灰度发布成功
- 做事严谨些,恢复隐藏索引对查询优化器不可见
答案
嗯,这题的答案选。。评论区大声告诉虚竹哥。
三、参考
MySQL进阶技能树>深入索引>隐藏索引 我是虚竹哥,我们明天见~