Java基础
线程状态
Mysql
查询计划
sql优化
可从以下几个方面优化:
- 减少数据扫描:尽可能利用索引、覆盖索引、联合索引
- 返回更少数据:尽量不要select *,数据多,增加网络传输压力
- 减少交互次数:批量Insert
- 减少服务器cpu和内存开销
- 深度分页查询优化
合理利用索引
使用联合索引时,尽量满足最左匹配原则。
深度分页优化
查询偏移量过大的场景我们称为深度分页,这会导致查询性能较低
select * from tb_order where user=xxx limit 10000, 10
1)id连续则可以改为范围查询
# 查询指定 ID 范围的数据
SELECT * FROM t_order WHERE id > 100000 AND id <= 100010 ORDER BY id
2)子查询:内层查询使用覆盖索引+外层查询使用主键索引
select * fomr tb_order where id in (select id from tb_order where user=xxx) limit 10000, 10
2)延迟关联:延迟关联的优化思路,跟子查询的优化思路其实是一样的:都是把条件转移到主键索引树,减少回表的次数。不同点是,延迟关联使用了 INNER JOIN(内连接) 包含子查询。使用连接代替in (in查询属于子查询,需要建立临时表)
SELECT o.*
FROM tb_order o
INNER JOIN (
SELECT id
FROM tb_order
WHERE user = 'xxx'
LIMIT 10000, 10
) AS subquery ON o.id = subquery.id;