数据库|SQL调优案例之TiFlash帮倒忙该怎么办?
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
摘要
TiDB是一款分布式NewSQL数据库,具备高可用和数据一致性。TiFlash作为TiDB的列存储引擎,虽然能加速查询,但有时可能导致性能下降。本文通过一个SQL调优案例,展示了如何避免TiFlash的负面影响,并优化了TiDB的查询性能。
背景
系统发生告警,经排查,是一条SQL导致频繁的内存不足(OOM)问题。经过一波慢SQL巡检和优化,发现一个慢SQL性能提升了1500倍以上。
分析过程
一个耗时8秒的单表聚合查询因为使用了TiFlash而进行了全表扫描。通过优化执行计划,发现TiFlash无法利用索引,导致扫描了近950万行数据。先确认过滤字段有索引,然后尝试强制优化器使用TiKV查询。解决了hint作用域问题后,查询仍然没有走索引。进一步分析发现,使用sysdate()函数导致索引失效。将sysdate()改为now(),查询时间从8.02秒降至4.43毫秒。
解决方案
通过强制优化器不走TiFlash查询,改为TiKV,以及避免使用动态时间函数,从而解决索引失效的问题。
深度思考
优化器可能因为估算值与实际值差异大而误走TiFlash。不确定TiFlash的估算原理是否会在正常索引下走TiKV。同时,动态时间并非导致优化器决策错误的主要原因。
总结
TiFlash是一个有价值的工具,但优化器仍在进化中,有时候可能出错。需要人工介入来调整。良好的SQL习惯极为关键,即便是先进的数据库也无法承受糟糕的SQL。
想要了解更多内容?