案例背景

  • 商品评论查询
  • 评论数据量很大,拥有十亿量级的评论数据,所以做了分裤分表,单表数据在百万级别
  • 因为场景都是查询某一个商品的评论,所以同一商品的评论放在一个表里

    存在问题

    深度分页

  • SQL:select * from comments where product_id=’xx’ and is_good_comment=’1’ order by id desc limit 100000,20

    • product_id:商品ID;有索引
    • is_good_comment:是否是好评;无索引
  • 查询过程:先走product_id的索引筛选出符合要求的数据,然后要进行回表判断is_good_comment,假设有几十万条评论,就要进行几十万次的回表;筛选完毕后,假设有十万条数据,还要对这十万条数据使用临时磁盘文件进行排序

    优化后的SQL

  • select * from comments a,(select id from comments where product_id=’xx’ and is_good_comment=’1’ order by id desc limit 100000,20) b where a.id=b.id

    • 首先在聚簇索引上执行子查询,倒序扫描主键id,并筛选出符合where要求的数据

      总结

      慢查询的其他原因

  • 磁盘IO负载高

  • 网络负载高,带宽打满
  • CPU负载高
  • 排查工具:mysql profilling