• 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

     

  • 相关阅读:
    [BJDCTF 2nd]fake google
    flask之ssti模板注入初窥
    ctfshow-web14
    ctfshow-web 13
    ctfshow-web12
    ctfshow-web 11
    ctfshow-web10
    ctfshow-web9
    python学习笔记(四)- 常用的字符串的方法
    python学习笔记(三)- 字典、集合
  • 原文地址:https://www.cnblogs.com/wanghj-15/p/11470506.html
Copyright © 2020-2023  润新知