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