mysql 优化数据库对象

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

范例:sql

    建表:
数据库

----------------------------------------------------------------------------------------------------------------------------------------+
| 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 |

插入数据:dom

    ……函数

查看表优化:优化

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
spa

             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类型。code


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

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


3. 逆规范化
    暂略


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

相关文章
相关标签/搜索