預計閱讀時間:8分鐘數據庫
1.優化表的數據類型bash
在建立數據庫表的時候,要判斷對應的數據類型,選擇合適的數據類型,雖然表設計的字段的長度能夠預留必定的長度,但不推薦不少字段都出現大量冗餘。這樣又浪費存儲空間,同是浪費物理內存。數據庫設計
咱們可使用 PROCEDURE ANALYSE() 函數分析當前表,該函數會建議提出優化建議,用戶能夠根據建議和實際狀況考慮是否優化。函數
/*表:tb_sys_user*/--------------------
/*列信息*/-----------
Field Type Collation Null Key Default Extra Privileges Comment
------------- ----------- --------------- ------ ------ ------- ------ ------------------------------- ----------
id int(11) (NULL) NO PRI (NULL) select,insert,update,references id
name varchar(20) utf8_general_ci NO (NULL) select,insert,update,references 名字
department_id int(11) (NULL) YES (NULL) select,insert,update,references 部門id
create_time datetime (NULL) NO (NULL) select,insert,update,references
update_time datetime (NULL) NO (NULL) select,insert,update,references
/*索引信息*/--------------
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
----------- ---------- -------- ------------ ----------- --------- ----------- -------- ------ ------ ---------- ------- ---------------
tb_sys_user 0 PRIMARY 1 id A 2 (NULL) (NULL) BTREE
/*DDL 信息*/------------
CREATE TABLE `tb_sys_user` (
`id` int(11) NOT NULL COMMENT 'id',
`name` varchar(20) NOT NULL COMMENT '名字',
`department_id` int(11) DEFAULT NULL COMMENT '部門id',
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
複製代碼
使用函數 PROCEDURE ANALYSE()性能
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
------------------------------ ------------------- ------------------- ---------- ---------- ---------------- ------ ----------------------- ------ ------------------------------------------------------------
test.tb_sys_user.id 0 2 1 1 1 0 1.0000 1.0000 ENUM('0','2') NOT NULL
test.tb_sys_user.name 12 234 2 3 0 0 2.5000 (NULL) ENUM('12','234') NOT NULL
test.tb_sys_user.department_id 12 12 2 2 1 0 6.0000 6.0000 ENUM('0','12') NOT NULL
test.tb_sys_user.create_time 2019-07-03 17:31:12 2019-07-03 17:31:27 19 19 0 0 19.0000 (NULL) ENUM('2019-07-03 17:31:12','2019-07-03 17:31:27') NOT NULL
test.tb_sys_user.update_time 2019-07-03 17:31:14 2019-08-02 17:31:28 19 19 0 0 19.0000 (NULL) ENUM('2019-07-03 17:31:14','2019-08-02 17:31:28') NOT NULL
複製代碼
2.經過拆分表提升表的訪問效率優化
所爲拆分表,若是指定MyISAM的類型,有2種方式進行拆分。spa
(1)垂直拆分:把主鍵和重要的列放在一個表,另外把主鍵和其餘的列放在另一張表。設計
應用場景:code
某張表,有些列常用,有些列不常用,能夠進行垂直拆分,另外,垂直拆分可使數據行變小,一個數據也能放更多的數據,在查詢時就會減小IO的次數,其次缺點是須要管理冗餘,查詢因此須要使用JOIN操做。cdn
(2)水平拆分:能夠根據某列和某多個列的數據的值放在單獨的兩個表中。。
應用場景:
a.表很大,分割後能夠查詢須要讀的數據和索引的頁數,同時也下降索引的層數,提升查詢速度。
b.表中的數據原本就有獨立性。
c.須要把數據存儲在多個介質。(好比說,某些和時間有關的數據,某半年把數據分一張表,超過半年歸檔歷史數據表)
3.逆規則化
數據庫設計時要知足數據庫的設計規範化,可是數據是否的規範化程度愈來愈高了呢?其實不少是需求決定的,由於規範程度高,數據之間的關係越來複雜就會致使表之間的操做會愈來愈頻繁,表之間的鏈接是會下降性能的,直接影響查詢的速度,因此有時候能夠經過反規則設計能夠提供性能,提升查詢速度。 反規則的好處不但能夠提升查詢速度,還能夠下降索引數目,減小表之間的關聯,反規則化有利有弊,根據實際的狀況,能夠解決性能問題,用的很差,反而下降查詢速度。 經常使用反規則化的方法:
(1)字段冗餘:指多個表存在相同的列,他也是常用查詢的能夠避免錶鏈接的操做。
(2)增長派生列:指增長的列的來自其餘的表的數據,由其餘的數據通過計算生成,增長派生列做用減小查詢鏈接操做。
4.使用中間表提升查詢速度
對於數據量比較大的表,在查詢的速度上效率會比較低,而且考慮查詢速度是否會負面影響,一般下,咱們能夠經過中間表提查詢的速度,好比說,天天的訂單都有不少,財務報表有統計一週的銷量,那麼咱們能夠新建一張中間表字段和數據類型同樣,把7天數據搬到這裏,直接統計,不用在總表查詢。
使用中間表的好處:
(1)中間表複製原表的數據,而且和原表隔離,在中間表查詢不會影響查詢負面影響
(2)中間表能夠靈活添加字段,或者添加索引,靈活使用,從而提高性能。
總結
數據庫對象設計的好壞是一個數據庫設計的基礎,從而一旦數據庫設計完成投入生產,未來進行修改就比較麻煩,所以數據庫設計的時候要多方面考慮。