实战经验

优化思路

性能参数:qps(每秒处理的请求数量)、 fps(每秒处理的事务数量)

配置优化

库优化

表优化

字段优化

查询优化

  • 调整Where字句中的连接顺序
MySQL 采用从左往右的顺序解析 where 子句,可以将过滤数据多的条件放在前面,最快速度缩小结果集。

使⽤ between and 的时候,区间跨度不要太⼤


  • 索引优化

    • 在区分度⾼的字段上⾯建⽴索引,区分度低的字段不建索引
    • 索引覆盖可以减少回表操作
    • 禁⽌对索引字段使⽤函数、运算符操作,会使索引失效
    • 排序字段尽量使用索引字段,可以考虑放在组合索引的后边,如:(userid,addtime)
    • 联合索引注意最左匹配原则:必须按照从左到右的顺序匹配,

      • mysql会⼀直向右匹配直到遇到范围查询(>、<、between、like)就停⽌匹配,
      • ⽐如a = 1 and b = 2 and c > 3 and d = 4
      • 如果建⽴(a,b,c,d)顺序的索引,d是⽤不到索引的,
      • 如果建⽴(a,b,d,c)的索引则都可以⽤到,a,b,d的顺序可以任意调整

代码优化

Danger

foreach + SQL 操作优先考虑批量操作

隔离级别

怎样实现死锁

原理

怎样解决死锁

查看死锁

怎样避免死锁

查询优化

发现问题:慢查询日志

  • 开启慢查询日志配置
[mysqld]
log_output='FILE,TABLE';

# 代表开启慢sql参数进行开启
slow_query_log=ON 

# 查询时间(秒)
long_query_time=0.001
  • 重启服务生效
service mysqld restart
  • 修改全局服务配置——不需要重启就可以生效
set global log_output='TABLE,FILE';
set global slow_query_log = 'NO';
set long_query_time = 0.001;

配置参数

当log_output设置为TABLE的时候,就会将mysql的慢查询日志记录到mysql.slow_log表中去

分页查询

Tip

分页读取数据 后修改数据 要考虑 使用 page++ 还是 page==1

如果修改的数据导致查询结果集变化,则应使用page==1 避免跳过了一半数据

当 offset 偏移量大的时候,sql执行回很慢

  • 1、使用 id > $page * $page_size offset 0 limit $page_size
  • 2、使用标识位标识 已执行过的数据,通过 do{} while (count($rs) == $page_size)
  • 3、分页数据状态修改后,谨慎考虑查询的页码是否要+1