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)中間表上能夠靈活的添加索引或增長臨時用的新字段,從而達到提升統計查詢效率和輔助統計查詢做用。

相關文章
相關標籤/搜索