优化数据库对象--数据库优化

优化数据库对象有这四种:

    1>:优化表的数据类型,每个字段选择合适的数据类型匹配。

    2>:通过拆分表提高表的访问速度

         2.1 垂直拆分表

        把主码和一些列放到一张表,然后主码和另外的列放另外一张表,把常用的列放一张表,不常用的放另外一张表。

                  优点:数据行变小,一个数据页存储数据更多,在查询时减少I/O

                  缺点:需要管理冗余列,查询所有数据需要联合JOIN操作

         2.2 水平拆分表

        根据一列或者多列的值把数据放到不同的表中,比如根据性别来分表,比如移动每三个月分一张表,根据区域分表。

              但是如果查询所有的话,会增加查询时间,所以一般需要根据实际情况考虑是否水平拆分表

   3>:逆规范化

           3.1 增加冗余列。通常在多个表中有相同的列,常用来在查询时候避免连接操作,如账单中没有用户名字,只要id,但是显示的时候有用户名字,可以考虑在账单表中添加一列用户的名字。

           3.2 增加派生列。指增加的列来自于其他表中的数据,有其他表中的数据经过计算得来。也可以减少连接查询

           3.3 重新组表。指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接提高性能

   对于上面的冗余,派生列逻辑实现方案: 

           1. 批处理维护,对冗余列或者派生列的修改积累到一定时间后,进行批处理修改,这是在实时性要求不高的情况下执行

           2.  可以通过应用逻辑实现,涉及到事务的使用增删

           3.  使用触发器,任何的修改都触发相应的列修改

   4>:使用中间表提高查询效率

           对于统计查询,通过建立中间表效率更高。

           例如:一个商店记录了每个客户的消费记录,现在需要查询最近一周的消费情况,这样就需要用这个数据

             方式一:

                select   sum(cust_amount) from consume where cust_date > addate(now(),-7);

              方式二:

                  先创建一个中间表 tmp_consume(表结构数据可以和原表完全相同,如果需要多余的列也可以添加)

                 insert into tmp_consume select * from consume where cust_date > adddate(now(),-7);

                select sum(cust_amout) from tmp_consume;  //然后再通过中间表的数据进行统计

          比较两个方案,在cust_date字段没有索引并且源表数据量很大的情况下,后者花费的时间明显比第一种低。

         后者方式的优点,减少在原有表中存在大量数据进行数据运算(非常消耗时间),可以对后面的表自己添加索引来提高查询速度。并且中间表和源表数据完全隔离,不会产生副作用。可以灵活的添加索引或者临时的新字段。

   

猜你喜欢

转载自blog.csdn.net/weixin_40792878/article/details/81088353