欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库优化

程序员文章站 2022-06-02 12:21:42
...

优化sql
    A:将一个Select语句的结果作为子集,然后从该子集中再进行查询
    B:使用“临时表”暂存中间结果
        避免程序中多次扫描主表,减少程序执行“共享锁”阻塞“更新锁”,提高并发


 减少数据库的访问使用索引
 A:使用索引的条件
        1,一个经常查询的字段  大于,小于,或者 in(),模糊查询
        2,主键和外键一般需要索引
        3,sql 执行查询的频率非常高
 B: 批量操作数据
 C: 用存储过程和存储函数
 D:创建索引
    普通索引:normal
    CREATE INDEX index_name ON table_name (column_list); 
    唯一索引:
    这个表中的数据不能重复我们捕获这个全局异常给出相应提示
    CREATE UNIQUE INDEX index_name ON table_name (column_list)
    主键索引:
        not null 
    全文索引

    不建议使用%前缀模糊查询

        like "%name" 或者  like "%name%" 这种查询会导致索引失效全表扫描。但是可以使用 like "name%"

   E:exist 代替 in , 用union all 取代 or

            in数据底层按数组进行排序了不应过多,如果限制条件中其他字段么有索引尽量少用or 使用 union all 或者 union

            in和 exists 主要造成驱动顺序的改变,exists 外表为驱动表,先被访问,适用于外表小内表大的情况,in反之。

            in 是在内存中遍历比较,exist(?ɡ'z?st) 需要查询数据库,数据量比较大时,exists效率优于in.

            not in 和 not exists 推荐使用第二

   F:  select 语句务必指明字段名称

   G: 一般外链接的查询效率大于子查询
   H: 尽可能使用更小的字段。越小的数据类型占用的空间越小
   I  : 避免where 子句中对字段进行null 判断

           null 判断导致引擎放弃索引,进行全表扫描


按时间统计 按月/日统计登录次数

   
按时间统计 按月/日统计登录次数
     

 SELECT * FROM (SELECT DATE(last_login) lastlogin,
            count(last_login) as count
            FROM tb_government_user 
            where last_login is not NULL
            GROUP BY DATE( last_login)
            )tb_government_user


            
J:批量操作数据
    批量提交数据减少与服务器的交互次数
    INSERT INTO score (change_type,score,user_id) VALUES ('吃饭',10,1),('喝茶',10,1),('喝茶',10,1);
  Update score  
  SET change_type = CASE id  
    WHEN 1 THEN 'value1'  
    WHEN 2 THEN 'value2'  
    WHEN 3 THEN 'value3'  
  END  
WHERE id IN (1,2,3)

能用 between 就不要用 in 了因为in 会进行全表扫描
    
J:存储过程和存储函数的优化
    将那些不会变的业务封装 可以减少网络交互的成本
    存储过程和存储函数都是存储在服务器端的SQL语句的集合
    https://www.jianshu.com/p/c59df5d8a798  //简书文章
    A: 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译 而sql 语句每次执行都必须编译
    B: 如果当对数据库进行复杂操作时(如对多个表进行Update,Insert) 可将此复杂操作用存储过程封装起来与
    数据库提供的事务处理结合一起使用
    C: 存储过程可以重复
    

 create procedure 存储过程名字([parameter])   
    [characteristics]
    [ WITH
        { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] 
    [ FOR REPLICATION ]
    AS sql_statement [ ...n ]
    begin   
    MySQL 语句;   
    end;
    ---------------
    [parameter]:
    [IN|OUT|INOUT] param_name type
    -----------
    characteristic:
    LANGUAGE SQL :  用来说明语句部分是SQL语句
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } : 子程序不包含读写
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'
 
routine_body:
    Valid SQL procedure statement or statements