mysql查询优化方案
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
- in ,not in会全表扫描
- 模糊查询也会全表扫描:select id from t where name like ‘%abc%‘
- 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引
limit结合order by查询优化
- 慢查询示例
select * from table where deleted_at = ? and owner_id = ? order by status, id desc limit ?
- 优化查询示例
select * from table no1 join(select id from table where deleted_at = ? and owner_id = ? order by status, id desc ) no2 on no1.id=no2.id limit ?;
- 对比分析
使用上面这种写法的原因:原始的“select * from table where deleted_at = ? and owner_id = ? order by status, id desc limit ?” 会先读索引,再读数据,然后抛弃不需要的数据;而第二种写法只读索引,使用了主键索引,然后根据索引读取需要的列,效率更高