目标:逼近数据库理论上的瓶颈
1、写明具体查询某几列,减少*的使用,表明过长时候,尽量使用表的别名
2、在业务密集型的sql中尽量不采用IN操作符,用EXISTS方案代替
in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
3、模糊查询like,尽量少用%
关键词%yue%,由于yue前面用了“%”,因此查询必然走全表扫描,除非必要,否在不要在关键词加%
4、二者都使用使用where(与having比较)
where先过滤,(数据就少了)在分组
5、尽量使用多表连接(join)查询(避免子查询)
子查询效率特别低,而一般的子查询都可以由关连查询来实现相同的功能,关联查询的效率要提高很多,所以建议在数据查询时避免使用子查询(尤其是在记录很多时),而最好用关联查询来实现。
6、建立索引
较频繁的作为查询条件的字段,唯一性不太差的字段建立索引,更新不太频繁的字段适合创建索引,不会出现在where条件正的字段不该建立索引
7、多实用内部函数提高sql效率
例如多用concat连接,代替“||”的符合连接
8、应尽量避免在where字句中使用!=或者<>,in 或 not in
最好不要给数据库刘null,尽可能的使用not null 填充数据库,(不然会进行全盘扫描,影响效率)
9、尽可能的使用varchar/nvachar 代替 char/nchar (节省字段存储空间)