0%

Mysql查询优化

Mysql大表问题处理

查询优化

为什么慢?

  1. 确定目标数据时,扫描行数太多

  2. 业务查询范围过大。

  3. 库本身数据量大

  4. 硬件

  5. mysql配置

  6. offset大

    解决

  7. 确定目标数据时,扫描行数太多

    1. 无索引

      • 常用
      1. 条件,排序,分组字段。
      • 其他
      1. 唯一索引使用了普通索引
      2. 关联字段类型不同,一个是int,一个是varchar
    2. 业务查询范围过大。

      1. 时间范围大

      2. 名称模糊查询和时间范围在一块

        前端门店模糊确定出门店编码,后端用branchCode精确查

  8. 数据量大,传输慢。

    1. 网络带宽
    2. 分批
  9. 库本身数据量大

    1. 分库分表
  10. 硬件

  11. mysql配置

  12. offset大

    1. 不用offset,改为id

    2. 延迟关联或者子查询优化

      阿里巴巴编码规范-说明:MySQL并不是跳过offset行,而是取offset+N行,然后返回前放弃前面的offset行,返回N行,那当offset特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQL改写。
      正例:先快谏定位需要获取的id段,然后再关联:

      1
      SELECT t1.* FROM1as t1,(select id from1 where 条件 limit 100000, 20as t2 where t1.id=t2.id
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      <select id="list" parameterType="com.xxx.OrderPageQuery" resultType="com.xxx.OrderDO">
      SELECT
      <include refid="all_columns"/>
      FROM t_order a
      INNER JOIN (
      SELECT id AS bid
      FROM t_order
      <include refid="listConditions"/>
      ORDER BY id DESC
      LIMIT #{offset},#{pageSize}
      ) b ON a.id = b.bid
      </select>

参考

[[Mysql性能分析和优化]]