SQL优化准则

禁用select *
使用select count(*) 统计行数
尽量少运算
尽量避免全表扫描,如果可以,在过滤列建立索引
尽量避免在where子句对字段进行null判断
尽量避免在where子句使用!= 或者<>
尽量避免在where子句使用or连接
尽量避免对字段进行表达式计算
尽量避免对字段进行函数操作
尽量避免使用不是复合索引的前缀列进行过滤连接
尽量少排序,如果可以,建立索引
尽量少join
尽量用join代替子查询
尽量避免在where子句中使用in,not in或者having,使用exists,not exists代替
尽量避免两端模糊匹配 like %xx%
尽量用union all代替union
尽量早过滤
避免类型转换
尽量批量insert
优先优化高并发sql,而不是频率低的大sql
尽可能对每一条sql进行explain
尽可能从全局出发

Sql中EXISTS与IN的效率问题

in 和exists

in是把外表和内表作表连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询。
一直以来认为exists 比in 效率高的说法是不准确的。如果查询的两个表大小相当,那么用in 和exists 差别不大。

not in 和not exists

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引。
而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

limit优化

limit常用于分页以及指定查询条数
limit n :n代表取出前n行。
limit m,n :m代表前m行,n代表取出n行。
limit工作原理是查询前m行,然后丢弃前m行,取出m后面的n行。
因此在m非常大的时候limit就会显得效率低下。
一种比较有效的优化方法是使用where先进行过滤,适用于自增长的列,比如ID主键。
select * from table limit m,n
-> select * from table where id > m limit n

    原文作者:晚歌y
    原文地址: https://www.jianshu.com/p/6b9eeacd8b97
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞