十7、Mysql之SQL优化查询

1、说到SQL优化,不少人就知道利用索引,可是当利用索引以后,查询速度仍是慢怎么解决?
  一、利用Explain查看sql运行是否使用了索引,
  二、sql优化以下
    1)、like语句查询时,全表查询,索引不会生效;
    2)、where子句中使用 != 或 <>操做符,索引不会生效;
      如: SQL:SELECT id FROM A WHERE ID != 1
      优化成:SELECT id FROM A WHERE ID>1 OR ID<1
    3)、where子句中使用 IS NULL 或 IS NOT NULL,索引不会生效;
      如: SQL:SELECT id FROM A WHERE num IS NULL
      优化成num上设置默认值0,确保表中num没有null值,
      而后SQL为:SELECT id FROM A WHERE num=0
    4)、使用union all(查询全部,有重复) 或 nuin(查询时,去除重复数据,性能慢)替换or;
      SQL:SELECT id FROM A WHERE num =10 or num = 20
      优化成:SELECT id FROM A WHERE num = 10 union all SELECT id FROM A WHERE num=20
    5)、in和not in替换;
      方案一:between替换in   
        如SQL:SELECT id FROM A WHERE num in(1,2,3)
        优化成:SELECT id FROM A WHERE num between 1 and 3   
      方案二:exist替换in(in 是在内存中遍历比较,exist 须要查询数据库,因此当B的数据量比较大时,exists效率优于in.)   
        如SQL:SELECT id FROM A WHERE num in(select num from b )
        优化成:SELECT num FROM A WHERE num exists(select 1 from B where B.num = A.num)
    6)、不要在where子句中的“=”左边进行函数、算数运算或其余表达式运算,不然系统将可能没法正确使用索引;
      如SQL:SELECT id FROM A WHERE num/2 = 100
      优化成:SELECT id FROM A WHERE num = 1002
    7)、用具体的字段列表替换"
";
    8)、使用“临时表”暂存中间结果,避免屡次扫描主表;
    9)、limit分页优化,当偏移量特别时,limit效率会很是低;
      如:SELECT id FROM A LIMIT 90000,10
      优化后:select id from A order by id limit 90000,10
    10)、批量插入优化 ;
      INSERT into person(name,age) values('test',1),('test',2),('test',3)
    11)、Inner join 和 left join、right join、子查询。
      查询性能Inner join>left join/right join>子查询sql

相关文章
相关标签/搜索