vlambda博客
学习文章列表

MySQL存储优化和数据库结构优化

     前面说了索引优化,现在我们来说一说存储优化和数据库结构优化 



数据库优化除了从索引方面入手,还可以从存储引擎和结构方面入手优化,当然还有硬件优化,服务器性能瓶颈,直接决定MySQL数据库的运行速度和效率,但是在这里我们就不介绍硬件优化了,主要说一说存储优化和数据库结构优化吧





01



MySQL存储优化




先介绍介绍存储引擎


存储引擎:

Show engines可以查看所有的存储引擎


innodb:

     支持事务

    行锁,锁定粒度小,并发性能高,有可能出现死锁,所有写操作不会锁定全表,在并发高时,使用InnoDB会提升效率。即存在大量updateinsert操作时,效率高


MyISAM:

     不支持事务

     表锁,锁定粒度大,并发性能低,避免出现死锁


存储优化:

         禁用索引:

    对于使用索引的表,插入记录时MySQL会对插入的记录建立索引,如果大量数据插入建立索引会降低速度。可以在插入数据之前禁用索引,输入插入完成后再开启索引

    Alter table table_name DISABLE KEYS

    Alter table table_name enable keys


        静止唯一性的检测:

    插入数据之前执行禁止对外键的检查,数据插入完成后再恢复,可以提供插入效率

    SET foreign_key_checks = 0;

    SET foreign_key_checks = 1;

 

        静止自动提交:

    插入数据之前执行静止事务的自动提交,数据插入完成后再恢复,可以提高查询效率

    禁用:SET autocommit = 0;

    开启:set autocommit = 1;


02


数据库结构优化


在设计表的时候,我们也可以对表进行一些优化,总结了以下几点


优化表结构:


1.尽量将表结构定义为Not Null约束,这时由于在MySQL中含有空值列很难进行查询优化,Null值会使用索引以及索引的统计信息变得复杂


2.对只包含特点类型的字段,可以使用enum,set数据类型


3.数值类型字段的比较比字符串比较效率高很多,字段类型尽量使用最小,最简单的数据类型


4.尽量使用TinyInt(4)SMALLINT6)、MEDIUM_INT(8)作为整型 而不是使用int


5.Varchar的长度只分配真正需要的空间


6.尽量使用TIMESTAMP而非DateTime,TIMESTAMP只能表示1970-2038,比DATETIME表示的范围小得多


7.表单不要有太多字段,建议20以内


8.合理加入冗余字段可以提高查询速度


表拆分优化:

    表拆分分为两种方式


    垂直拆分:

按照某一个字段拆分,把字段拎出去 一个字段一张表


    水平拆分:

拆数据,比如对ID进行取余,id%2=0分一张表,不等于0放另一张表


 读写分离优化:

        

数据库基本上是读多写少的,数据库读取的压力会比较大,可以采用主从结构的设计。其中一个是主库负责写入,其他都是从库负责数据的读取


mysql自带主从复制功能,可以使用主从复制的主库作为写库,从库和主库进行数据同步

        

03


优化总结


1.执行计划调优

    熟读执行计划,十大参数


2.语句调优

    尽量全值匹配


    范围条件放最后


    Null/Not 有影响


3.索引调优
    遵循最左前缀法则


    不在索引列上做任何操作


    覆盖索引尽量用


    不等于要甚用


    Like查询要当心


    字符类型加引号


    OR改UNION效率高


4.设计调优
    数据量大,可以分库分表


    并行执行多条sql,比如查询多个表的数据总条数,可以优化成并行执行


    主从同步,读写分离


5.业务调优
    调整业务 比如分页,以前可以指定页数区查询,可以改成下拉形式


    返回大数据量,应该考虑需求是否合理