MySQL 8.0索引新特性对查询优化的影响
MySQL 8.0引入了两个对查询优化有直接影响的索引特性:不可见索引(Invisible Index)和降序索引(Descending Index)。不可见索引允许在索引存在的情况下让优化器忽略它,用于安全评估索引删除影响;降序索引支持在B+Tree索引中按降序存储键值,解决ORDER BY DESC场景下的额外排序开销。
这两个特性在实际运维中解决不同痛点:不可见索引解决索引删除的风险评估问题——线上环境删除一个索引后如果查询性能下降,重建索引的成本很高;降序索引解决复合排序场景的文件排序(filesort)问题——当查询需要按多列不同方向排序时,传统升序索引无法避免额外的排序步骤。
不可见索引:安全评估索引删除影响
数据库运行一段时间后经常积累大量冗余索引,这些索引占用存储空间、降低写入性能,但运维人员不敢贸然删除,因为无法预判哪些查询会受影响。不可见索引提供了一种中间态:索引物理存在且数据持续维护,但优化器在生成执行计划时忽略它。
设置索引为不可见:
ALTER INDEX idx_order_status_time INVISIBLE;
恢复为可见:
ALTER INDEX idx_order_status_time VISIBLE;
操作前后对比查询执行计划,如果不可见后执行计划未变差,说明该索引可安全删除。如果执行计划变差,立即恢复可见,无需重建索引。
降序索引:消除复合排序的filesort
MySQL 8.0之前,索引只支持升序存储。MySQL 8.0真正支持降序索引,B+Tree索引中键值按指定方向排列。
典型场景:电商订单表按状态筛选并按创建时间倒序排列:
SELECT * FROM orders WHERE status = 'SHIPPED' ORDER BY create_time DESC LIMIT 50;
传统升序索引idx(status, create_time)可以走索引扫描,但扫描方向与ORDER BY DESC相反,MySQL需要反向扫描索引或执行filesort。
降序索引创建:
CREATE INDEX idx_status_time_desc ON orders(status ASC, create_time DESC);
此索引的B+Tree在status列按升序排列,同一status值内create_time按降序排列,与查询的排序方向完全一致,无需filesort。
降序索引在多列混合排序场景的应用
多列混合排序是降序索引最有价值的应用场景。例如:订单列表按支付状态升序、支付时间降序排列:
SELECT * FROM orders ORDER BY payment_status ASC, payment_time DESC LIMIT 100;
创建混合排序索引:
CREATE INDEX idx_payment_status_time ON orders(payment_status ASC, payment_time DESC);
这个索引中payment_status升序存储,相同payment_status的记录按payment_time降序存储,与ORDER BY完全匹配。对比测试:在100万行订单表上,无降序索引时查询耗时约120ms(含filesort),有降序索引后耗时降至约3ms,性能提升约40倍。
不可见索引与降序索引的组合运维策略
线上环境的索引变更应遵循安全流程:先创建新索引(含降序索引),将旧索引设为不可见,观察一段时间,确认无影响后删除旧索引。
操作步骤:第一步创建降序索引,第二步将旧索引设为不可见,第三步观察监控指标,第四步确认安全后删除旧索引。如果第三步发现问题,立即将旧索引恢复可见。
降序索引的使用限制与注意事项
降序索引有几个使用限制:不支持全文索引和空间索引;HASH索引不支持降序;降序索引的最左前缀匹配规则与升序索引一致,但排序方向也参与匹配。索引中每列的排序方向必须与ORDER BY子句中对应列的排序方向完全一致,或全部相反。此外,降序索引的统计信息收集与升序索引一致,ANALYZE TABLE后优化器才能准确评估降序索引的选择性。
索引优化效果的量化监控
索引变更后需量化评估效果。MySQL 8.0的performance_schema提供了细粒度的查询性能数据。关键监控指标:Queries、Query_run_time_avg、No_index_used、Filesort。建议在索引变更前后各采集24小时的performance_schema数据,对比关键查询的执行时间分布。也可以通过sys.schema_unused_indexes视图找出未被使用的索引,通过sys.schema_redundant_indexes视图找出冗余索引,结合不可见索引做安全验证后清理。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/mysql80-bu-ke-jian-suo-yin-yu-jiang-xu-suo-yin-shi-zhan-you/