MySQL单机优化---SQL优化

SQL优化变多次维护为一次维护

  Sql优化分为:DDL、DML、DQL

  一、DDL优化

 

    1 、通过禁用索引来提供导入数据性能 。 这个操作主要针对有数据库的表,追加数据

 

      //去除键

 

      alter table test3 DISABLE keys;

 

      //批量插入数据

 

      insert into test3 select * from test;

 

      //恢复键

 

      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

 

    变多次事务提交为一次事务提交

 

 

  二、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)

 

    变多次事务提交为一次事务提交

 

  三、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

 

 

    原文作者:十五小哥哥
    原文地址: https://www.cnblogs.com/wanghj-15/p/11470506.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞