十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

相關文章
相關標籤/搜索