NOTE

1.3 MySQL SQL调优

1. 单机MySQL瓶颈 300万数据,2000并发 2. 整体思路 - 数据库优化.md 3. 步骤 3.1. 定位慢查询 - MySQL慢查询日志.md - MySQL索引.md 3.2. 分析SQL - MySQL explain.md - MySQL show profile.md 3.3.

MySQL / Database创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 单机MySQL瓶颈

300万数据,2000并发

2. 整体思路

  • 数据库优化.md(关联笔记尚未公开)

3. 步骤

3.1. 定位慢查询

3.2. 分析SQL

3.3. 重写SQL

  1. 限定数据的查询范围: 比如订单数据只查询一个月以内的
  2. 分页查询优化
    • 数据库层面
      • 比如select * from table where age > 20 limit 1000000,10修改为select * from table where id in (select id from table where age > 20 limit 1000000,10)。核心思想都一样,就是减少load的数据.
    • 从需求的角度减少这种请求
      • 不做类似的需求(直接跳转到几百万页之后的具体某一页.只允许逐页查看或者按照给定的路线走)

4. 实例

4.1. 分页查询优化

  • 如果有100W数据,取最后10W

4.1.1. limit offset

  • 传统写法select * from xxx limit 10W offset 90W
  • 无法利用索引,需要扫描全表再取出最后10W

4.1.2. limit id

  • select * from xxx where id in (select id from xxx limit 10W offest 90W)
  • 可以走ID索引,但依然需要扫描全ID索引

4.1.3. 连接查询

  • select from xxx INNER J0IN( select id from xxx limit 10W, 90W) as a USING(id)

4.1.4. BETWEEN … AND

  • select * from xxx where id BETWEEN 90W AND 100W
  • 可以走ID索引,如果ID不是连续自增的,那么这种方式就不可行了

4.1.5. 最大id查询法

  • select * from xxx where id > 90W limit 10W
  • 可以利用ID索引

4.2. 批量更新

MySQL-批量更新数据的六种方法 - 掘金

4.3. Join优化

  • 如果可以使用被驱动表的索引,join语句还是有其优势的;
  • 不能使用被驱动表的索引,只能使用Block Nested-Loop Join算法,这样的语句就尽量不要使用;
  • 在使用join的时候,应该让小表做驱动表。
  • MySQL表访问方法.md

5. 参考