掘金 人工智能 07月08日 14:38
MySQL 8.0 的隐藏索引:索引管理的利器,还是性能陷阱?
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

MySQL 8.0引入了隐藏索引功能,允许用户快速启用/禁用索引,而不影响优化器。本文介绍了隐藏索引的应用场景、作用、创建和使用方法,并通过实例展示了其在软删除、灰度发布、索引维护和临时禁用无用索引等方面的实际应用。

🔍 隐藏索引允许用户快速启用/禁用索引,而不影响优化器。它主要用于软删除、灰度发布、索引维护和临时禁用无用索引等场景。

🚫 隐藏索引不会被优化器使用,但仍需维护。它通过写入操作保持最新,但即使使用“FORCE INDEX”,优化器也不会使用它。

🔄 用户可以通过创建具有隐藏索引的表或将现有索引更改为隐藏来使用隐藏索引。隐藏索引的存在不会影响查询的执行,但会减少不必要的开销。

📊 在使用带有隐藏索引的“FORCE INDEX”时,MySQL会执行全表扫描,即使有其他可用的索引。这可能导致大型表上的严重性能问题。

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

0 前言

MySQL8.0开始支持隐藏索引,不可见索引。它允许快速启用/禁用MySQL Optimizer使用的索引。

隐藏索引不会被优化器使用,但仍需维护

1 应用场景

2 啥用?

若想删除一个索引,又想事先知道效果。可使它对优化程序不可见。这是一个快速的元数据更改,使索引不可见。一旦确定没有性能下降,就可真正去删除索引。

关键:隐藏索引不能供优化器使用,但它仍存在,并通过写入操作保持最新。即便尝试“FORCE INDEX”,优化器也不会用它,虽然我认为我们应该能在某种程度强制它。可能会有这样情况:

可创建一个新的隐形索引,但若想测试它,须使它可见。即所有对应用程序有即时影响的查询都将能用它。若目的只是想测试它,我不认为这是最好方法,不是所有人的服务器都有相同的数据大小和真实数据。强制隐藏索引这时可能会很有用。

你有许多索引,但不确定哪个未使用。可将一个索引更改为不可见,以查看是否存在任何性能下降。若是,你可立即更改。

可能有个特殊情况:只有一个查询可用该索引。此时,隐藏索引可能是很好解决方案。

3 创建

有两个选项:

3.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;

3.2 alter table并将索引更改为隐藏

ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE;

4 使用

如果我们现在要删除索引,我们可以将其更改为隐藏。 但是使用“FORCE / USE INDEX”的查询怎么样? 他们是否会抛出一个错误? 如果强制不存在的索引,你会收到错误。 你不会看到隐藏索引的错误。 优化器不会使用它,但知道它存在。

show create table t1 G*************************** 1. row ***************************Table: t1Create Table: CREATE TABLE `t1` (`i` int(11) DEFAULT NULL,`j` int(11) DEFAULT NULL,`k` int(11) DEFAULT NULL,KEY `i_idx` (`i`),KEY `idx_1` (`i`,`j`,`k`)) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)mysql> explain select * from t1 force index(idx_1) where i=1 and j=4;+----+-------------+-------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key   | key_len | ref         | rows | filtered | Extra       |+----+-------------+-------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+|  1 | SIMPLE      | t1    | NULL       | ref  | idx_1         | idx_1 | 10      | const,const |    2 |   100.00 | Using index |+----+-------------+-------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)mysql> alter table t1 alter index idx_1 invisible;Query OK, 0 rows affected (0.01 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> explain select * from t1 force index(idx_1) where i=1 and j=4;+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+|  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   16 |     6.25 | Using where |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+1 row in set, 1 warning (0.01 sec)mysql> explain select * from t1 where i=1 and j=4;+----+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key   | key_len | ref   | rows | filtered | Extra       |+----+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------------+|  1 | SIMPLE      | t1    | NULL       | ref  | i_idx         | i_idx | 5       | const |    2 |    10.00 | Using where |+----+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)

若用带有隐藏索引的“FORCE INDEX”,MySQL会执行全表扫描。 MySQL不会抛任何错误,因为索引存在,但不可见。 即使有另一个可用的索引,它也将执行全表扫描。

大型表上,这可能导致严重性能问题。 即使MySQL在查询执行期间不抛任何错误,它也应在错误日志中记录一个警告。

本文由博客一文多发平台 OpenWrite 发布!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MySQL 隐藏索引 数据库优化
相关文章