- 避免使用**select ***
- .用 union all 代替 union
union 会去重,去重过程需要遍历,排序,比较,更消耗cpu资源
确定唯一,没有重复数据能用union all尽量用 - 如果主查询的数据集大,则使用in关键字,效率高。如果子查询的数据集大,则使用exist关键字,效率高。
- 尽量少用or (mysql优化器对or没有太好的优化,可以使用IN、union 或 union all 代替or)
- 批量插入
- 尽量用 join 代替子查询
(相比于子查询,join的性能要好一些,虽然 Join 性能并不佳,但是和 MySQL 的子查询比起来还是有非常大的性能优势。)。 - 用where字句替换HAVING字句
避免使用HAVING字句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤,而where则是在聚合前刷选记录,如果能通过where字句限制记录的数目,那就能减少这方面的开销。 - count(1) 和 count(primary_key) 优于 count(*)
- 多表关联查询时,小表在前,大表在后
(在MySQL中,执行 from 后的表关联查询是从左往右执行的(Oracle相反),第一张表会涉及到全表扫描,所以将小表放在前面,先扫小表,扫描快效率较高,在扫描后面的大表,或许只扫描大表的前100行就符合返回条件并return了。) - 调整Where字句中的连接顺序
(MySQL采用从左往右,自上而下的顺序解析where子句。根据这个原理,应将过滤数据多的条件往前放,最快速度缩小结果集。)
sql 优化
于 2022-06-19 20:40:16 首次发布