一点点数据库优化

                                                                                        优化方向:
    1、数据库设计:
        基本支持三范式{简述:原子性约束(属性列数据不可分解),唯一性约束(表记录唯一如主键ID),冗余性约束(字段重复少)}
    2、添加索引:
        索引原理:索引以B+tree为排序的数据结构,运用二叉树算法折半查找,高效查询,效率提升2的N次方
        [mysql例]:索引类型:主键索引,唯一索引,全文索引(innodb不支持),组合索引,普通索引;
        执行查询计划 explain 查看查询是否使用了索引:    
            如执行:explain select * from table where table.id = 1
            返回列:table | type | possible_keys | key | key_len | ref | rows | Extra
            其中type表示是否使用索引,如type=ALL为全表扫描,type=ref 等为使用了索引
        索引缺点
            建索引文件,占用磁盘空间;
            对DML(update、delete、insert)语句的效率影响,增删改会对索引影响,因为索引要重新整理;
            索引不可太多,否则严重影响DML操作;
        建索引场景
            在where条件中经常使用的字段;
            字段内容不是唯一的几个值;
            字段内容不频繁发生变化;
    3、SQL语句优化:
        定位慢查询语句
            慢查询:mysql默认10秒没有返回结果的属于慢查询
                修改慢查询:
                    --查询慢查询时间
                    show variables like 'long_query_time';
                    --修改慢查询时间
                    set long_query_time=1; ---但是重启mysql之后,long_query_time依然是my.ini中的值
            
   定位慢查询:安全模式启动mysql,借用大神笔记: https://cloud.tencent.com/info/036ff3d7067eb3e1054b8177838c7247.html
                   定位后可在日志文件中查看具体慢查询语句;
        优化原则:1)避免全表扫描,2)避免查询建临时表
            like :  -- like '%qwer%' ;qwer前加% 走全表扫描,
                优化: -- like 'qwer%' 
            where: 1)在where子句中使用 != 或 <>操作符,索引被弃用,会全表扫描,
                优化: -- WHERE ID>5 OR ID<5
                2)在where子句中使用 IS NULL 或 IS NOT NULL 判断,索引被放弃用,会全表扫描,
                优化:设计表时尽量不要设置默认值为null
                3)where中使用or连接条件,索引被弃用,
                优化:必要时可以使用 union all 代替
                4)where子句使用in 或 not in 慎用,弃用索引,全表扫描
                优化:between and 代替
               5)where子句中的“=”左边进行函数、算数运算或其他表达式运算,否则系统将可能无法正确使用索引,如:                                     --   WHERE  num/2 = 100
                优化:(函数放=号右边)-- WHERE num = 100*2
                6)limit分页优化,当偏移量特别时,limit效率会非常低 如:SELECT id FROM tableName LIMIT 100000,10 很慢
                优化:select id from tableName order by id limit 100000,10; 很快,  因为主键做了索引
                7)where和order by 连用时注意,如果where中用到索引列那么order by 中将不会使用索引了,
                优化:两者都要用的话,尽量使用联合索引
                8)结果集合并 尽量使用 union all,  避免使用UNION
                9)子查询的性能比外连接性能慢,尽量用外连接来替换子查询  
                10)避免函数索引 如:(d上建了索引) SELECT * FROM t WHERE YEAR(d) >= 2018;
                优化:SELECT * FROM t WHERE d >= '2018-01-01';  (oracle支持函数索引,mysql不支持)
                11)建立联合索引,对order by 联合排序效率极高
            避免使用临时表:(除非确实有需要)
                1、UNION查询;
                2、用到TEMPTABLE算法或者是UNION查询中的视图;
                3、ORDER BY和GROUP BY的子句不一样时;
                4、表连接中,ORDER BY的列不是驱动表中的;
                5、DISTINCT查询并且加上ORDER BY时;
                6、SQL中用到SQL_SMALL_RESULT选项时;
                7、FROM中的子查询;
                8、子查询或者semi-join时创建的表;                
            
    4、分表分库
        垂直拆分:项目模块化,将表划分到多个数据库中,服务弱耦合化,用于分布式场景
        水平拆分:行数据拆分到不同表中,具体根据业务需求,有的按照注册时间、取摸、账号规则、年份等。
            这里说下取模方式分表:(特点:数据均匀分布在各个分表中)
                
    5、读写分离
        请参考大神博客: https://www.cnblogs.com/luckcs/articles/2543607.html

    6、存储过程 [模块化编程,可以提高速度]
    7、对mysql配置优化
        filesort优化策略:
            1.适当增大sort_buffer_size参数的设置
            2.适当增大max_length_for_sort_data参数的设置
    8、mysql服务器硬件升级
    9、定时的去清除不需要的数据,定时进行碎片整理(MyISAM)

                

你可能感兴趣的:(一点点数据库优化)