Mysql调优

Mysql调优

  • 注意1:互联网中的mysql查询,单表查询不超过100ms,大表查询不超过200ms,设置慢查询阈值一般是1000ms,即超过1000ms即需要慢查询优化
  • 注意2:单台mysql服务器的并发量最高QPS
  • 注意3:一般mysql服务器都需要限制连接个数,

面试真题:说一下Mysql如何做调优

  • 第一步:发现问题
    • 开启Mysql监控,运用普罗米修斯工具,监控生产运行时Mysql服务器的运行情况,内存,CPU,磁盘IO,请求超时等,并开启告警
    • 开启慢查询日志
    • 针对性分析:例如长事务导致锁表等待等。
  • 第二步:分析问题
    • 1、分析告警时内存,CPU,IO,超时等情况,检查当时运行时可能的定时任务,可能的长事务请求,并发请求量等
    • 2、运用explain分析慢查询日志中的SQL,分析扫描行数,关联表数量,运用索引情况,以及优化建议等
    • 3、根据运行时调用的SQL,找到可能的原因
    • 4、根据原因,分析验证最终原因,例如是查询大表没有使用索引,多表关联,不合理使用groupby,orderby等造成大量临时表等,使用函数造成大量运算
  • 第三步:解决问题
    • 根据分析结果,具体原因,优化代码,或者优化SQL,优化SQL配置,使用缓存等等方式
    • 提出解决方案,
  • 第四步:验证问题
    • 修改后在灰度环境或压测环境测试,查看并发时的响应时间,达到预期则上生产

常见解决方案落地

  • 使用mysql监控
    • show profile查询剖析工具
      • 语法 show profile all for query n
      • block io 显示IO次数
      • context switches 上下文切换次数
      • cpu 用户CPU时间
      • IPC 发送和接收的消息数量
      • page faults 显示页错误数量
      • source 源码中函数名称与位置
      • swaps 显示swaps次数
    • show processlist查看链接线程数
  • 分析慢SQL原因
    • 关键处没有索引
    • 索引不生效:使用了not in ,like/not like,in元素过多 ,<>,is null等
    • 深度分页,大表问题,宽表问题,
    • gourp by 使用临时表和文件排序:groupby元素加索引或调整排序
    • 网络问题,并发读写加锁问题,
  • 慢SQL优化
    • 使用explain分析慢SQL:主要分析扫描行数,联表,索引使用,优化建议等
      • 表的读取顺序, 小表驱动大表
      • 数据读取的操作类型
      • 索引的使用,以及实际使用索引
      • 表的引用
      • 扫描的行数
      • 实际返回的行数
      • 使用了哪些查询过滤优化器
    • 运用索引优化
      • where,order by ,group by的字段尽量使用索引,甚至索引下推,select字段尽量使用覆盖索引,避免回表
      • 读多写少字段加索引,字段顺序匹配索引字段顺序使用最左前缀匹配原则
      • 删除多余索引,对经常查询字段加索引
      • where后面尽可能多的过滤,不要再select中使用函数,尽量少使用函数
    • 深度分页优化
      • 使用标签记录法:上一次查询的最大ID做为标签
      • 延迟关联法,即先找到复核条件ID,在通过In查询获取数据
    • 大表优化
      • 运用ShardingJDBC分表,例如通过Hash取模
      • 分库分表
    • 宽表优化
      • 垂直分表
    • 大量联表优化
      • 最多不能超过三张表关联
  • 全局优化
    • 引擎优化
    • mysql配置优化
    • 索引文件结构优化
    • 代码优化-事务大改小,多联表改为小联表
    • 缓存优化-合理使用缓存
    • 集群优化-主从复制,读写分离
    • 替代优化:大内存字段改为文件服务器存储,全文索引改为ES
  • 表设计规范优化
    • 数据类型合理,数据长度合理,字段验证合理,避免null
    • 正确添加索引,适当冗余,适当的字段数量,适当的外键管理
    • 其他优化,例如大表ID为long,小表尾int,日期用datetime,Ip用int,
索引优化
  • 索引作用:大大减少服务器扫描的数据量,帮助服务器避免排序和临时表 将随机io变成顺序io
  • 主键索引、唯一索引、普通索引、全文索引、组合索引
  • 聚簇索引,非聚簇索引
    • 跟引擎有关,跟索引和数据有关
  • 回表、覆盖索引、最左匹配、索引下推
    • 回表:selecct或where索引不足返回数据,需要从磁盘加载数据
    • 覆盖索引:select和where列完全可以使用索引
    • 最左匹配:select和where和和组合索引有匹配
    • 索引下推:在覆盖索引不足情况下,使用where条件过滤一部分
  • 哈希表(MyISAM)、B+树(Innodb)
    • Hash表适合于数字的等于查询,一般避免使用
  • 全值匹配,最左前缀,匹配列前缀,匹配范围值,精准匹配
  • 自增主键索引
  • 组合索引
  • 使用覆盖索引,索引下推
  • 隐藏索引 :逐步让索引失效
    • create index 索引名 on 表名(列名) invisible
架构调优
  • 考虑业务实际情况把不适合数据库做的事情拆分出来
    • 大文件存储采用文件服务器
    • 高频全文索引采用ES
    • 字典查询等放到缓存
    • 某些复杂查询放到数据仓库
  • 读写压力过大,主从复制,读写分离
    • 运用ShardingJdbc结合主从同步
  • 数据库容量大,单表过大:分区分表
    • 运用Shardingjdbc分区分表
    • 运用Mycat作为底层代理

你可能感兴趣的:(mysql,数据库)