引言

在关系型数据库中,针对你的工作负载创建和维护恰当的索引对于确保良好的性能至关重要。然而,创建良好的索引并不是一次性活动,仅在添加新表时完成。随着表数据增长、模式演变,以及最重要的——你的应用程序发送的查询随时间变化,索引需求也会发生变化。为了确保应用程序的查询能够正确地被索引,能够观察哪些索引被实际使用(或未被使用)非常重要。
为了帮助解决这一问题,我们在 PlanetScale Insights 中新增了一项功能:**索引使用情况跟踪**。通过此功能,你可以轻松查看查询使用了哪些索引,以及这些使用情况随时间的变化趋势。
下面让我们深入了解这项功能。


功能展示

要查看某个查询模式的索引使用情况图表,进入 Insights 仪表板,点击一个 SELECT 查询,然后点击右上角的新 “Indexes” 标签页。例如:
![查询模式索引使用情况图](索引使用情况图)
主图表显示了各索引的查询使用百分比随时间的变化趋势。底部的柱状图表则显示了整个时间跨度内各索引的累计使用情况。在上述示例中,我们可以看到 MySQL 在每次执行查询模式时,从三个索引之一中进行选择。
这个视图显示了某个查询的索引使用情况,但我们同样可以反过来提问:**哪些查询正在使用某个索引?** 为了解答这个问题,进入 Insights 主页面,并在搜索框中输入 index:$TABLE_NAME.$INDEX_NAME 作为搜索词。例如:
![按索引搜索查询](按索引搜索查询截图)
注意:索引信息仅针对 SELECT 查询报告。因此,在删除索引之前,必须独立验证该索引不会用于 UPDATEDELETE 查询中。
你还可以使用 Insights 搜索框中的 indexed:false 搜索词,找到未使用任何索引的查询模式列表。
![搜索未被索引的查询](搜索未被索引的查询截图)
这些与索引相关的搜索词可以与其他搜索词组合。例如,要查找过去 24 小时内至少执行了 1000 次、p50 响应时间超过 250 毫秒的所有未被索引的查询,可输入:

indexed:false query_count:>1000 p50:>250

如果你对我们如何以及为何实现这一功能感兴趣,请继续阅读以下部分。


现有工具和实现

在构建新的索引使用监控系统之前,我们对现有的索引使用监控和理解工具进行了评估。以下是这些工具的探索内容,它激励了我们设计 Insights 使用跟踪功能的决策。

  1. Explain 工具大多数开发者试图理解索引使用情况时,首先会使用 EXPLAIN,这也是有理由的。EXPLAIN 是一个非常强大的工具,它揭示了 MySQL 执行查询时的大量信息,包括索引使用情况。它非常适合排查问题查询或测试新索引。然而,EXPLAIN 只能为你手动提供的查询提供信息。它无法记录实际 MySQL 处理的查询信息,因此无法显示某个查询模式在生产中随时间、跨分片或不同查询参数的索引使用情况。
  2. MySQL 的 Performance Schema对于生产环境中的索引总体使用情况,MySQL 内置的 Performance Schema 提供了一个表 (table_io_waits_summary_by_index_usage),记录每个索引的使用次数。这是一个有用的工具,但也有许多实用上的限制:
    1. 统计是全局的计数,每次 MySQL 重启时会重置。这意味着无法看到随时间的使用趋势,并且计数可能随时被重置。
    2. 计数仅针对索引,而不清楚是哪些查询模式使用了哪些索引。

Insights 的设计目标

为了简化理解索引使用模式,我们希望构建一个系统,满足以下目标:

  • 按查询模式划分索引使用信息
  • 将索引使用数据存储为时间序列,以便容易观察变化;
  • 为所有查询提供累计数据,而不是基于 EXPLAIN 计划进行采样或推测**。

基于上述目标,我们首先需要从 MySQL 中提取查询索引使用信息。由于 PlanetScale 数据库仅使用 InnoDB 存储引擎,因此我们可以将精力集中在该引擎上。InnoDB 的存储处理器包含一个索引初始化函数,在 MySQL 查询真正使用索引之前会调用一次该函数。通过记录该函数传递的索引名称到查询的数据结构中,我们可以找出每个查询使用的所有索引。当查询完成时,我们将使用的索引列表返回给 MySQL 客户端,最终返回到 Vitess 的查询代理层 VTGate。
在拥有每查询的索引信息后,VTGate 会按查询模式聚合索引使用信息,并每 15 秒将其发送到 Insights 管道中。这种方法允许我们以微不足道的 MySQL 开销聚合 100% 查询的索引使用计数的时间序列。


结论

通过索引使用跟踪功能,PlanetScale Insights 为开发者提供了强大的工具来观察索引的使用情况。这不仅帮助团队优化数据库查询性能,还支持持续监控和演变工作负载中的索引需求。随着查询模式、表数据和索引使用的变化,现在有了一个清晰的视图可以帮助你随时调整数据库性能优化方案。



使用 Insights 跟踪索引使用情况插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://folen.top/2025/09/14/insights-tracking/