1, 使用 limit
当不需要取出全部数据时, 在查询后面加上 limit 限制.
2,select *
每次看到 select * 的时候都需要用怀疑的眼光审视, 是不是真的需要返回全部的列.
3, 重复查询相同的数据
有时可能会重复执行相同的查询, 比如在用户评论的地方需要查询用户头像 url, 如果用户多次评论, 可能就会反复查询这个数据. 比较好的方案是, 当初次查询的时候将这个数据缓存起来, 需要的时候从缓存中取出, 这样性能显然会更好.
4, 列表 IN() 的比较
相对于 OR,IN() 的处理速度更快.
5, 分解关联查询
对于一些复杂的关联查询可以拆分为多个简单查询. 这样可以让缓存的效率更高; 执行单个查询可以减少锁的竞争; 减少冗余记录的查询; 查询本身效率也可能会有所提升.
6, 关联子查询
慎用关联子查询, 特别是 where 条件中包含 IN() 的子查询.
7, 优化 UNION 查询
除非必要, 否则使用 union all. 如果没有 all 关键字, MySQL 会给临时表加上 distinct 选项, 这会导致对整个临时表的数据做唯一性检查.
如果使用 union 的同时要使用 limit, 则在 union 的各个子句中分别使用 limit 速度更快些.
- (select id, name from A order by id)
- union all
- (select id, name from B order by id)
- order by id limit 20;
上面这个语句是先查询所有满足条件的数据, 存放临时表中, 再从临时表中取出 20 条数据.
这个语句可以优化成:
- (select id, name from A order by id limit 20)
- union all
- (select id, name from B order by id limit 20)
- order by id limit 20;
优化后的语句是分别查询 20 条数据存放临时表中, 总共 40 条数据, 再从临时表中取出 20 条数据.
8,MIN() 和 MAX() 优化
对于 min() 和 max() 查询, MySQL 的优化做的并不好. 使用时往往会造成全表扫描. 如:
select max(id) from A where name = 'XXX';
可以使用 limit 来优化查询:
select id from A where name = 'XXX' order by id DESC limit 1;
9, 使用索引查询
这个可以参考 https://www.linuxidc.com/Linux/2018-11/155369.htm
来源: http://www.linuxidc.com/Linux/2019-03/157517.htm