这是我参与「第四届青训营 」笔记创作活动的第3天
慢查询是指数据库中查询时间超过指定阈值(美团设置为100ms)的SQL,它是数据库的性能杀手,也是业务优化数据库访问的重要抓手。 对于数据库来说,慢查询往往意味着风险。SQL执行得越慢,消耗的CPU资源或IO资源也会越大。大量的慢查询可直接引发业务故障,关注慢查询即是关注故障本身。
1.SQL查询优化
- SQL 是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做
- 查询优化的目标是为 SQL 找到一个正确的且执行代价最小的执行计划
- 查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是 NP 的
- 一般 SQL 越复杂,Join 的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍
2.慢查询优化
- 最直接有效的方法就是选用一个查询效率高的索引。关于高效率的索引推荐,主要在日常工作中,基于经验规则的推荐随处可见,对于简单的SQL,如
select * from sync_test1 where name like 'Bobby%',直接添加索引IX(name) 就可以取得不错的效果;但对于稍微复杂点的SQL,如select * from sync_test1 where name like 'Bobby%' and dt > '2021-07-06',到底选择IX(name)、IX(dt)、IX(dt,name) 还是IX(name,dt),该方法也无法给出准确的回答。更别说像多表Join、子查询这样复杂的场景了。 - 所以采用基于代价的推荐来解决该问题会更加普适,因为基于代价的方法使用了和数据库优化器相同的方式,去量化评估所有的可能性,选出的是执行SQL耗费代价最小的索引。
3.原理
对于优化器来说,执行一条SQL有各种各样的方案可供选择,如表是否用索引、选择哪个索引、是否使用范围扫描、多表Join的连接顺序和子查询的执行方式等。需要定义一个量化数值指标,这个指标就是代价(Cost),来分别计算出可选方案的操作耗时,从中选出最小值。
4.SQL 相关的前沿趋势
- 存储计算分离
- HSAP, HTAP, HTSAP
- Cloud Native, Serverless
- 数据仓库,数据湖,湖仓一体,联邦查询