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.
这是历史学习笔记,可能存在过时或不完整的理解。
1. 单机MySQL瓶颈
300万数据,2000并发
2. 整体思路
- 数据库优化.md(关联笔记尚未公开)
3. 步骤
3.1. 定位慢查询
3.2. 分析SQL
3.3. 重写SQL
- 限定数据的查询范围: 比如订单数据只查询一个月以内的
- 分页查询优化
- 数据库层面
- 比如
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. 批量更新
4.3. Join优化
- 如果可以使用被驱动表的索引,join语句还是有其优势的;
- 不能使用被驱动表的索引,只能使用Block Nested-Loop Join算法,这样的语句就尽量不要使用;
- 在使用join的时候,应该让小表做驱动表。
- MySQL表访问方法.md