Skip to content

Instantly share code, notes, and snippets.

@LittleFall
Last active October 22, 2022 03:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LittleFall/7f0ddfb2dd6d029e06d22760f6eb1de1 to your computer and use it in GitHub Desktop.
Save LittleFall/7f0ddfb2dd6d029e06d22760f6eb1de1 to your computer and use it in GitHub Desktop.
TiDB Hackathon 2022 - 你说了算‘s RFC.md Secret

AutoIndex

项目介绍

实现一个健壮的自动化索引推荐、TiFlash 副本推荐系统。能针对数以万计的 TiDB 在线集群进行准确的索引和 TiFlash 副本推荐。如果用户开启自动执行开关,还能自动执行新增索引和新增 TiFlash 副本。

背景&动机

适当的索引能够极大的优化用户查询,但需要深厚的经验才能给出相关建议。比如:

  • Select * from t where a=1, 如果不加 a 为索引,就需要全表扫描
  • Select * from t where id = 10 and b > '2022-10-17'。大多数情况下新增 (id, b) 索引会更好,但是用户可能会错误的把索引加成 (b, id)

除了索引,TiDB 还有其列式存储计算引擎 TiFlash 组件,可以对某些大量查询、聚合、join请求进行加速。但是用户有时候基本上连自己的 SQL 长啥样都说不清,更不要说让他们分清楚哪些 SQL 加索引,哪些表为它们加一个 tiflash 副本了。

甚至一些资深的 DBA 也很难把这事搞得非常完美,有时候为了优化一个查询,新增了一个索引。虽然查询性能是提升了,但是增加了写入的负担,导致整体集群的负载反而更高了。

我们希望设计一个面向云的健壮的索引推荐、TiFlash副本推荐系统。并能把这些建议自动化地帮助用户执行到他们的数据库上。

项目设计

image

以自动加索引为例(TiFlash 广义上也可以是一个索引,所以本质差别不大),主要模块是一个无状态的服务 AutoIndexer, 它针对每一个 TiDB Cloud 里的 TiDB 集群,循环地做以下事:

  1. Study: 从 Top SQL、Slow Query 等系统中发现这个集群消耗资源排名前 N 的 SQL,得到待优化 SQL
  2. What-if: 实现 TiDB 优化器的 what-if API,从优化器中获得索引推荐和代价优化估算。
  3. Mirror: 当代价优化达到一定阈值时,对 TiDB 集群开启一个新的 B Cluster(或者叫影子集群),对并且把流量 mirror 过去。
  4. Experiment: 对每个索引推荐进行实验,查看 B Cluster 的 Top SQL 结果,得知实验的优化效果。
  5. Apply: 如果实验有效,将实验效果推荐给用户;如果用户开启了“自动执行”开关,会自动在原 Cluster 上执行。

展望

基于本项目的架构,除了对常规的二级索引和 TiFlash 副本进行推荐和设置之外,后续还可以考虑自动扩缩容、自动物化视图、设置聚簇索引等,进一步帮助用户降本增效。

参考论文

https://www.microsoft.com/en-us/research/uploads/prod/2019/02/autoindexing_azuredb.pdf

@zanmato1984
Copy link

牛啊!

@LittleFall
Copy link
Author

牛啊!

强啊!!

@SunRunAway
Copy link

大力出奇迹

@easonn7
Copy link

easonn7 commented Oct 21, 2022

考虑加索引的时候,也考虑下减索引? 有些索引基本没用,可以先 invisible ,然后过段时间干掉,最终减少了写入 overhead...

@SunRunAway
Copy link

考虑加索引的时候,也考虑下减索引? 有些索引基本没用,可以先 invisible ,然后过段时间干掉,最终减少了写入 overhead...

可以!会加到 Hackathon PPT 的“未来展望”里 😂

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment