MySQL單機優化---SQL優化

SQL優化變屢次維護爲一次維護html

  Sql優化分爲:DDL、DML、DQLsql

  1、DDL優化數據庫

 

    1 、經過禁用索引來提供導入數據性能 。 這個操做主要針對有數據庫的表,追加數據mybatis

 

      //去除鍵性能

 

      alter table test3 DISABLE keys;優化

 

      //批量插入數據spa

 

      insert into test3 select * from test;htm

 

      //恢復鍵blog

 

      alter table test3 ENABLE keys;排序

 

    變屢次索引維護爲一次索引維護

 

 

 

       2、 關閉惟一校驗

 

      set unique_checks=0  關閉

 

      //批量插入數據

 

      insert into test3 select * from test;

 

      set unique_checks=1  開啓

 

    變屢次惟一校驗爲一次惟一校驗

 

 

 

        3、修改事務提交方式(導入)

 

      set autocommit=0   關閉# false

 

      //批量插入

 

      set autocommit=1   開啓 true

 

    變屢次事務提交爲一次事務提交

 

 

  2、DML優化

 

    insert into test (name) values(2);

 

    insert into test values(1,3);

 

    insert into test values(1,4);

 

    //合併多條爲一條 mybatis的批量操做:

 

    insert into test values(1,2),(1,3),(1,4)

 

    變屢次事務提交爲一次事務提交

 

  3、DQL優化

 

    (1)   1 order by優化

 

      1、多用索引排序

 

      2、普通結果排序(非索引排序)Filesort

 

      索引自己就是排序的,因此多使用索引

 

    (2)    group by優化

 

      查詢某個時間的付款總和

 

      explain

 

      select DATE_FORMAT(payment_date,'%Y-%m'),sum(amount) from payment GROUP BY DATE_FORMAT(payment_date,'%Y-%m') ;

 

      explain

 

      select DATE_FORMAT(payment_date,'%Y-%m'),sum(amount) from payment GROUP BY DATE_FORMAT(payment_date,'%Y-%m') order by null;

 

      group by是使用order by null,取消默認排序

 

 

 

    (3) subQuery嵌套優化

 

       在客戶列表找到不在支付列表的客戶

 

       #在客戶列表找到不在「支付列表」的客戶 , 查詢沒買過東西的客戶

 

       explain

 

       select * from customer where customer_id not in (select DISTINCT customer_id from payment);

 

       explain

 

          select * from customer c left join payment p on(c.customer_id=p.customer_id) where p.customer_id is null   -- 這種是基於「索引」外鏈

 

 

 

    (4) or優化

 

      在兩個獨立索引上使用or的性能優於

 

      1or兩邊都是用索引字段作判斷,性能好!!

 

      2or兩邊,有一邊不用,性能差

 

      3、 若是employee表的nameemail這兩列是一個複合索引,可是若是是 :name='A' OR email='B' 這種方式,不會用到索引!

 

 

 

    (5)   limit優化

 

      select film_id,description from film order by title limit 50,5;

 

      select a.film_id,a.description from filqm a inner join (select film_id from film order by title limit 50,5)b on a.film_id=b.film_id

 

 

  30sql語句優化:https://www.cnblogs.com/Little-Li/p/8031295.html

相關文章
相關標籤/搜索