mysql 8.0 in 索引_关于 MySQL 8.0 新特性“隐藏索引”的一点思考

MySQL 8.0有一个称为“隐藏索引”的新功能,它允许快速启用/禁用MySQL Optimizer使用的索引。

在此分享一些对这个新功能的首次使用经验和想法。

对我们有什么用?

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

关键的一点是,隐藏索引不能供优化器使用,但它仍然存在,并通过写入操作保持最新。即便我们尝试“FORCE INDEX”,优化器也不会使用它,虽然我认为我们应该能够在某种程度上强制它。可能会有这样的情况:我们可以创建一个新的隐形索引,但如果想要测试它,必须使它可见。这意味着所有对应用程序有即时影响的查询都将能够使用它。如果目的只是想测试它,我不认为这是最好的方法,不是所有人的服务器上都有相同的数据大小和真实数据。强制隐藏索引这时候可能会很有用。

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

你可能有一个特殊情况,只有一个查询可以使用该索引。在这种情况下,隐藏索引可能是一个很好的解决方案。

怎么创建隐藏索引

有两个选项。 我们可以创建一个具有隐藏索引的表,如下所示: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`) INVISIBLE

) ENGINE=InnoDB DEFAULT CHARSET=latin1

或者我们可以使用alter table并将索引更改为隐藏:ALTER TABLE t1 ALTER INDEX idx_1 INVISIBLE;

怎么使用隐藏索引

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

*************************** 1. row ***************************

Table: t1

Create 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在查询执行期间不抛出任何错误,它也应该会在错误日志中记录一个警告。

结论

我认为隐形索引是一个伟大的新功能,可以对许多人有用。 如果有需要,可以尝试着去使用,并且尝试记录试图使用隐藏索引的查询,说不定会得到一些惊喜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值