mysql 优化数据库对象

谁说我不能喝 提交于 2020-01-07 15:07:41

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1.优化表的数据类型:
    表需要使用何种数据类型是需要根据应用来判断的。虽然应用设计的时候需要考虑字段的长度留有一定的冗余,
    但是不推荐让很多字段都存有大量的冗余,这样既浪费磁盘存储空间,同时在应用程序操作时也浪费物理内存。
    在mysql中,可以使用函数PROCEDURE ANALYSE()对当前应用的表进行分析,
    该函数可以对数据表中列的数据类型提出优化建议,
    用户可以根据应用的实际情况考虑是否实施优化。
    如: select * from warning_repaired PROCEDURE ANALYSE()\G;

范例:

    建表:

----------------------------------------------------------------------------------------------------------------------------------------+
| warning_repaired | CREATE TABLE `warning_repaired` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_moid` varchar(36) NOT NULL,
  `device_name` varchar(128) DEFAULT NULL,
  `device_type` varchar(36) DEFAULT NULL,
  `device_ip` varchar(128) DEFAULT NULL,
  `warning_type` enum('0','1','2') NOT NULL,
  `domain_moid` varchar(36) NOT NULL,
  `domain_name` varchar(128) DEFAULT NULL,
  `code` smallint(6) NOT NULL,
  `level` varchar(16) NOT NULL,
  `description` varchar(128) DEFAULT NULL,
  `start_time` datetime NOT NULL,
  `resolve_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=980390 DEFAULT CHARSET=utf8 |

插入数据:

    ……

查看表优化:

select * from warning_repaired PROCEDURE ANALYSE()\G;

*************************** 10. row ***************************
             Field_name: nms_db.warning_repaired.level
              Min_value: critical
              Max_value: normal
             Min_length: 6
             Max_length: 9
             Empties_or_zeros: 0
             Nulls: 0
             Avg_value_or_avg_length: 8.0004
             Std: NULL

             Optimal_fieldtype: ENUM('critical','important','normal') NOT NULL

可以看出level,Min_value,Max_value, Min_length, Max_length, Avg_value_or_avg_length, 因为level的值只有三种:ciritical, important, normal,所以Optimal_fieldtype:建议使用ENUM类型。


2.通过折分提高表的访问效率
    这里所说的“折分”,是指对数据表进行折分。如果针对MyISAM类型的表进行,那么有两种折分方法。
    (1)第一种方法是垂直折分,即把主码和一些列放在一个表,然后把主码和另外的列放到另一个表中。
        如果一个表中某些列常用,而另一些列不常用,则可以采用垂直折分,另外,垂直折分可以使数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。其缺点是管理冗余列,查询所有数据需要联合(JOIN)操作。

    (2)第二种方法是水平折分,即根据一列或多列数据的值把数据行放到两个独立的表中。
        水平折分通常在以下几种情况下使用。
            1)表很大,分割后可以降低在查询时需要读数据和索引的页数,同时降低了索引的层数,提高查询速度。
            2)表中的数据本来就有独立性,例如,表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
            3)需要把数据存放到多个介质上。
             例如:移动电话的账单就可以分成两个表或多个表。最近3个月的账单数据存放在一个表中,3个月前的历史账单存放  在另一个表中,超过1年的历史账单可以存储到单独的存储介质上,这种折分是最常用使用的水平折分方法。
             水平折分会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要UNION操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加2~3倍数据量,查询时也就增加读一个索引层的磁盘次数,所以水平折分需要考虑数据量的增长速度,根据实际情况决定是否需要对表进行水平折分。


3. 逆规范化
    暂略


4. 使用中间表提高统计查询速度
    对于数据量较大的表,在其上进行统计查询通常会效率很低,并且还要考虑统计查询是否会对在线的应用产生负面影响。通常在这种情况下,使用中间表可以提高统计查询的效率。
    中间表在统计查询中经常会用到,其优点如下:
    (1)中间表复制源表部分数据,并且与源表相"隔离",在中间表上做统计查询不会对在线应用产生负面影响。
    (2)中间表上可以灵活的添加索引或增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询作用。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!