【推荐】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)中间表上可以灵活的添加索引或增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询作用。
来源:oschina
链接:https://my.oschina.net/u/1475335/blog/543772