不可见索引(Invisible Indexes)MySQL 8.0之后引入的一个重要特性。也可以帮助DBA或者开发者更好的管理和维护数据库的索引。本文将介绍不可见索引的一些常见使用场景和注意事项。
通常,线上运行时间较长的系统,可以通过索引使用统计信息知道哪些索引是从来不被使用的,但依旧会占用磁盘空间,并且会影响系统的写入/更新/删除操作的性能。但是删除索引的操作,有时候也会带来意想不到的系统性能下降,所以,在正式删除之前,可以先将索引修改为不可用,待观察数日后再进行删除,会更加安全。
有时候在对线上系统进行SQL性能分析时,有时候为了排除某些索引对查询性能影响时,可以暂时的将某些索引暂时标记为不可用,再统计此时的SQL执行时长与性能。然后,再将索引置为可见,再次执行SQL,并统计执行时长与性能。
通过这样对比,可以非常简单直观、量化的观察到索引对对于具体SQL性能的提升。
虽然不可见索引不会被查询优化器使用,但在对数据进行DML操作(如:插入、更新、删除)时仍会被维护。这意味着不可见索引可能会对数据库性能产生一定影响。在使用不可见索引进行性能测试或分析时,请务必权衡这一点。
如果确定某个不可见索引对查询性能没有帮助,建议尽早删除该索引,以节省存储空间和减小维护成本。否则,该索引对系统性能没有起到任何正面作用,反而会占用空间,并影响DML的性能。
在优化器选项(optimizer_switch)中,可以通过打开标记位(use_invisible_indexes),来强制优化器忽略索引的不可见属性,这在增加了SQL性能调试时的灵活性。
可以通过SELECT/SHOW命令查询优化器选项,也可用通过SET命令变更该选项:
SET [GLOBAL|SESSION] optimizer_switch='command[,command]...';
SET SESSION optimizer_switch = 'use_invisible_indexes=ON';