zoukankan      html  css  js  c++  java
  • SQL优化建议(mysql)

    1. 尽量避免在where子句中使用!=或<>操作符,否则将引起放弃使用索引而进行全表扫描。

    2. 对查询进行优化,因尽量避免全表扫描,首先应考虑在where以及order by涉及的列上建立索引。

    3. 因尽量避免在where子句中对字段进行null判断,否则将导致引擎放弃使用索引而进行全表扫描。比如:

    select id from user where num is null

    可以在num上设置默认值为0,确保表中num列没有null值,然后这样查询:

    select id from user where num=10

    4. 尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,比如:

    select id from user where num=10 or num=20

    可以这样查询:

    select id from user where num=10
    union all
    select id from user where num=20

    5. 下面的查询也将导致全表扫描:(不能前置百分号)

    select id from user where name like '%N%'

    下面走的是索引

    select id from user where name like 'N%';

    若要提高效率,可以考虑全文检查。

    6.  in 和 not in也要慎重,否则会导致全表扫描,比如:

    select id from user where num in(1,2,3);

    对于连续的数值,能用between 就不要使用in:

    select id from user where num between 1 and 3;

    7. 如果在where子句中使用参数,也会导致全表扫描。

    因为sql只有在运行时才会解析局部变量,但优化程序不能讲访问计划的选择推迟到运行时;他必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

    select id from user where num=@num

    可以改为强制查询使用索引:

    select id from user with(index(索引名)) where num=@num

    8. 尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。比如:

    select id from user where num/2=100
    #应该为:
    select id from user where num=100*2

    9. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎弃用而进行全表扫描:

    select id from user where substring(name,1,3)='abc'
    #name以abc开头的id
    
    select id from user where datediff(day,createdate,'2018-11-30')=0
    #'2018-11-30'生成的id

    应改为:

    select id from user where name like 'abc%'
    
    select id from user where createdate>='2018-11-30' and createdate<'2018-12-1'

    10. 不要在where子句中的“=”左边进行函数、算数运算或者其他表达式运算,否则系统可能无法正确使用索引。

    11. 在使用索引字段作为条件是,如果该索引是复合索引,那么必须使用到改索引中的第一个字段作为条件是才能保证系统使用该索引,否则该索引将不会被使用,并且应尽量可能的让字段顺序与索引顺序相一致。

    12. 不要写一些没有意义的查询,如需要生成一个空表结构:

    select col1,col2 into #user from user where 1=0

    这类代码不会返回任何结果集,但是会消耗系统资源,正确写法为:

    create table #user(...)

    13. 很多时候使用exists代替in是一个好的选择:

    select num from a where num in(select num from b)

    替换为:

    select num from a where exists (select 1 from b where num=a.num)

    14.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

    15. 尽量避免大事务操作,提高系统并发能力

  • 相关阅读:
    js对象的所有方法
    js数组的所有方法
    Scss语法
    new一个对象的过程
    promises的深入学习
    jsonp的原理介绍及Promise封装
    Vue页面缓存和不缓存的方法
    JavaScript数据类型
    JS常用函数原理的实现
    @Autowired注解在抽象类中实效的原因分析
  • 原文地址:https://www.cnblogs.com/superdrew/p/9972966.html
Copyright © 2011-2022 走看看