MYSQL優化數據庫對象

預計閱讀時間: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)中間表能夠靈活添加字段,或者添加索引,靈活使用,從而提高性能。

總結

    數據庫對象設計的好壞是一個數據庫設計的基礎,從而一旦數據庫設計完成投入生產,未來進行修改就比較麻煩,所以數據庫設計的時候要多方面考慮。

相關文章
相關標籤/搜索