【第13天】SQL进阶-索引的隐藏索引(SQL 小虚竹)

回城传送–》《32天SQL筑基》

零、前言

今天是学习 SQL 打卡的第 13 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。

希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。

​ 虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

今天的学习内容是:SQL进阶-索引的隐藏索引

一、练习题目

题目链接 难度
SQL进阶-索引的隐藏索引 ★★★☆☆

二、SQL思路

SQL进阶-隐藏索引

在这里插入图片描述
在这里插入图片描述

初始化数据

drop table if exists user_profile;
CREATE TABLE `user_profile` (
`id` int PRIMARY KEY  ,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float);
INSERT INTO user_profile VALUES(1,2234,'male',21,'北京大学',3.2);
INSERT INTO user_profile VALUES(2,2235,'male',null,'复旦大学',3.8);
INSERT INTO user_profile VALUES(3,2236,'female',20,'复旦大学',3.5);
INSERT INTO user_profile VALUES(4,2237,'female',23,'浙江大学',3.3);
INSERT INTO user_profile VALUES(5,2238,'male',25,'复旦大学',3.1);
INSERT INTO user_profile VALUES(6,2239,'male',25,'北京大学',3.6);
INSERT INTO user_profile VALUES(7,2240,'male',null,'清华大学',3.3);
INSERT INTO user_profile VALUES(8,2241,'female',null,'北京大学',3.7);

解法

要求处理:

  • 四个选项,选择一个正确答案

分析:

  • 这是一个比较新的知识点,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

模拟索引软删除

  • 先创建普通索引,查看索引是否有创建成功
CREATE INDEX idx_device_id
ON user_profile (device_id);
SHOW INDEX FROM user_profile;

在这里插入图片描述

  • 用explain 解析sql语句是否索引有生效
explain select id,device_id
from user_profile
where device_id=2240

在这里插入图片描述

  • 把普通索引设置为隐藏索引
ALTER TABLE user_profile ALTER INDEX idx_device_id INVISIBLE;
  • 用explain 解析sql语句,看索引是否隐藏,不会生效
explain select id,device_id
from user_profile
where device_id=2240

在这里插入图片描述

  • 查看下这时候表的索引情况
SHOW INDEX FROM user_profile;

在这里插入图片描述

  • 假装隐藏索引导致系统异常,需要快速恢复
ALTER TABLE user_profile ALTER INDEX idx_device_id VISIBLE;
  • 查看下这时候表的索引情况
SHOW INDEX FROM user_profile;

在这里插入图片描述

  • 用explain 解析sql语句,看索引是否重新生效
explain select id,device_id
from user_profile
where device_id=2240

在这里插入图片描述

  • 假装隐藏索引不影响系统,删除索引
ALTER TABLE user_profile ALTER INDEX idx_device_id INVISIBLE;
 DROP INDEX idx_device_id
ON user_profile;
  • 查看下这时候表的索引情况
SHOW INDEX FROM user_profile;

在这里插入图片描述

模拟灰度发布

  • 创建索引时,把索引设置为隐藏索引
CREATE INDEX idx_device_id
ON user_profile (device_id) INVISIBLE;
  • 查看下这时候表的索引情况
SHOW INDEX FROM user_profile;

在这里插入图片描述

  • 用explain 解析sql语句是否索引有生效
explain select id,device_id
from user_profile
where device_id=2240

在这里插入图片描述

修改查询优化器的开关(隐藏索引对查询优化器可见)

set session optimizer_switch="use_invisible_indexes=on";

重点是这个set session :设置的会话变量仅限于当前连接(当前会话)。当前连接断开后,其设置的所有会话变量均失效

  • 用explain 解析sql语句是否索引有生效,索引生效了。
explain select id,device_id
from user_profile
where device_id=2240

在这里插入图片描述

  • 如果隐藏索引有效果,再把索引设置为可见索引,灰度发布成功

ALTER TABLE user_profile ALTER INDEX idx_device_id VISIBLE;
  • 做事严谨些,恢复隐藏索引对查询优化器不可见
set session optimizer_switch="use_invisible_indexes=off";

答案

嗯,这题的答案选。。评论区大声告诉虚竹哥。
我是虚竹哥,我们明天见~

猜你喜欢

转载自blog.csdn.net/shi_hong_fei_hei/article/details/126737492
今日推荐