有哪些常见的数据库优化方法
2个回答
2020-11-05 · MySQL开源数据库领先者
关注
展开全部
MRR 是 MySQL 针对特定查询的一种优化手段。假设一个查询有二级索引可用,读完二级索引后要回表才能查到那些不在当前二级索引上的列值,由于二级索引上引用的主键值不一定是有序的,因此就有可能造成大量的随机 IO,如果回表前把主键值给它排一下序,那么在回表的时候就可以用顺序 IO 取代原本的随机 IO。
如果想关闭 MRR 优化的话,就要把优化器开关 mrr 设置为 off。
默认只有在优化器认为 MRR 可以带来优化的情况下才会走 MRR,如果你想不管什么时候能走 MRR 的都走 MRR 的话,你要把 mrr_cost_based 设置为 off,不过最好不要这么干,因为这确实是一个坑,MRR 不一定什么时候都好,全表扫描有时候会更加快,如果在这种场景下走 MRR 就完成了。
MRR 要把主键排个序,这样之后对磁盘的操作就是由顺序读代替之前的随机读。从资源的使用情况上来看就是让 CPU 和内存多做点事,来换磁盘的顺序读。然而排序是需要内存的,这块内存的大小就由参数 read_rnd_buffer_size 来控制。
如果想关闭 MRR 优化的话,就要把优化器开关 mrr 设置为 off。
默认只有在优化器认为 MRR 可以带来优化的情况下才会走 MRR,如果你想不管什么时候能走 MRR 的都走 MRR 的话,你要把 mrr_cost_based 设置为 off,不过最好不要这么干,因为这确实是一个坑,MRR 不一定什么时候都好,全表扫描有时候会更加快,如果在这种场景下走 MRR 就完成了。
MRR 要把主键排个序,这样之后对磁盘的操作就是由顺序读代替之前的随机读。从资源的使用情况上来看就是让 CPU 和内存多做点事,来换磁盘的顺序读。然而排序是需要内存的,这块内存的大小就由参数 read_rnd_buffer_size 来控制。
展开全部
数据库优化的指导思路是首先写出的SQL是优化器喜欢的,然后在排除烂的SQL的情况下就是,找瓶颈,数据库吞吐量上不去或者查询慢都是因为某一瓶颈的存在,从非常大的粒度来看,瓶颈可以分为五类:io 内存 CPU 网络 锁。
当卡在某一瓶颈时,其他的资源就会被闲置,解决瓶颈或者用非瓶颈的资源做trade off达到总和的最大才是优化的正解,比如建索引就是以空间换时间的做法。
由于数据库相对比较复杂,上下文有区别优化思路也会不一样,所以离开上下文谈具体的优化手段就是坑。
大部分开发人员会犯的错误是所谓的“锤子人”,也就是自己是锤子看什么都像钉子,比如觉得慢就说要分区,觉得某种语句的写法一定比另一种快而不考虑场景。
当卡在某一瓶颈时,其他的资源就会被闲置,解决瓶颈或者用非瓶颈的资源做trade off达到总和的最大才是优化的正解,比如建索引就是以空间换时间的做法。
由于数据库相对比较复杂,上下文有区别优化思路也会不一样,所以离开上下文谈具体的优化手段就是坑。
大部分开发人员会犯的错误是所谓的“锤子人”,也就是自己是锤子看什么都像钉子,比如觉得慢就说要分区,觉得某种语句的写法一定比另一种快而不考虑场景。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |