第13天SQL进阶-索引的隐藏索引(SQL 小虚竹)
Posted 小虚竹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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";
答案
嗯,这题的答案选。。评论区大声告诉虚竹哥。
我是虚竹哥,我们明天见~
以上是关于第13天SQL进阶-索引的隐藏索引(SQL 小虚竹)的主要内容,如果未能解决你的问题,请参考以下文章
第31天MYSQL进阶-写优化- 插入优化(SQL 小虚竹)
第26天SQL进阶-查询优化- performance_schema系列实战二:锁问题排查(MDL锁)(SQL 小虚竹)
第26天SQL进阶-查询优化- performance_schema系列实战二:锁问题排查(MDL锁)(SQL 小虚竹)
第26天SQL进阶-查询优化- performance_schema系列实战二:锁问题排查(MDL锁)(SQL 小虚竹)