explain之后(个人见解 仅供参考 欢迎批评指正)
1. 确认当前sql中的索引使用 是否正常 如果不正常 尝试给适当的字段增加索引(但是建立索引的时候 我们需要考虑索引的性能 一般建议一张表 索引字段的占比 控制在30%以下 如果索引过多 会导致我们更新、删除的操作变慢)
2. 查询的字段 应该遵循 要什么查什么 不用的字段 尽量不要查出来
3. 结合业务 把当前sql中的left join替换为join (原因:join要求两张表都要有数据 left join只要左表有数据即可 使用join会使关联的数据变少 直接提高查询效率)
4. 确认一下当前sql中是否有子查询 如果有子查询 尝试把子查询并入到sql中 如果不能并入 则尝试把sql分开查询
5. 在实际业务中 我们往往会遇到查询出的数据有大字段的可能,而且业务往往也会对满足初级条件的数据 做二次筛选 建议在初次查询的时候 只把小字段给查出来 然后对满足二次筛选条件 且确定需要返回的大字段 根据主键id再查一次 防止因为返回数据过多 导致慢sql出现的现象
6. 我们在写sql的时候 顺序往往是 select * from test where id > 1 group by age have score > 18 order by id desc limit 10
此sql在mysql中的实际执行顺序是 from > join > where > group by > having > select > (查出数据到内存中 这也解释了为什么在使用group by之后 order by 为什么会失效的原因) > order by > limit 从上面的执行顺序中 我们可以得出 在我们关联表的时候 尽量把on条件带上 否则sql在执行的过程中 会全表关联 然后才经过where的筛选 虽然我们在返回结果中 看不到二者的区别 但是在实际执行的过程中 会隐形的提高sql查询的笛卡尔积