mysql调优

面试时都会碰到的一个常见的一个问题:mysql调优

    对于开发者而言,调优的重点在于:开发规范,数据库索引,又或者解决线上慢查询问题

理论上来说 如果表有一定的数据量,那就应该创建对应的索引,数据库查询注意的地方还是蛮多的,比如:

1,是否能使用【覆盖索引】,减少【回表】所消耗的时间,就是说我们查询时一定要指明对应的列,而不是select *

2,考虑是否组建【联合索引】,尽量将区分度最高的放在最左边,并且考虑【最左匹配原则】

3,避免对索引进行函数操作或者表达式计算,因为会导致索引失效

4,通过explain命令查看sql的执行计划看看是否走了索引,走了什么索引,通过show profile 来看sql对系统资源消耗的情况(一般用的比较少)

5,开启事务后,在事务内尽可能只操作数据库,并有意识的减少锁的持有时间(比如在事务内插入和修改数据,可以先插入再修改,因为修改是更新操作,会加行锁,如果先更新,在并发场景下会导致多个事务的请求等待行锁释放)

    说到这,可能有人遇到过即使走了索引,线上查询还是慢的问题,那要怎么做呢

一般这种走了索引还是慢基本是因为表的数据量实在是太大了,可以考虑能不能把旧的数据给删掉,但是一般不会这么做,那么就可以考虑走一层缓存(redis)这时候要考虑业务能不能接受非真正实时的数据,而如果查询条件比较复杂那缓存也不是一种好的办法

后面就再看看是不是有字符串检索的场景 导致查询效率低,如果有,可以考虑把数据导入Elasticserach,后续直接走Elasticserach

如果还不是,那么就要考虑查询条件的维度,做一些相应的聚合表,线上请求直接查询聚合表,总之就是以空间换时间的思路

还可以考虑读写分离,分库分表等

 

    

posted @ 2021-07-01 15:40  展小迷  阅读(137)  评论(0)    收藏  举报