數據庫優化專題---11、數據庫結構優化

數據庫優化專題—1、表的主鍵用數字還是UUID
數據庫優化專題—2、邏輯刪除還是物理刪除
數據庫優化專題—3、千萬記錄如何快速分頁
數據庫優化專題—4、讀多寫少和讀多寫多
數據庫優化專題—5、刪改數據如何避免鎖表
數據庫優化專題—6、如何避免偷換交易中的商品信息
數據庫優化專題—7、SQL語句優化
數據庫優化專題—8、Mysql參數優化
數據庫優化專題—9、索引優化
數據庫優化專題—10、存儲優化
數據庫優化專題—11、數據庫結構優化

這節主要介紹下數據庫結構優化,包含優化表結構、表分區等。

優化表結構

  • 儘量將表字段定義爲NOT NULL約束,這時由於在MySQL中含有空值的列很難 進行查詢優化,NULL值會使索引以及索引的統計信息變得很複雜;
  • 對於只包含特定類型的字段,可以使用enum、set 等數據類型;
  • 數值型字段的比較比字符串的比較效率高得多,字段類型儘量使用小、簡單的數據類型。例如IP地址可以使用int類型;
  • 儘量使用TINYINT、SMALLINT、MEDIUM_INT作爲整數類型而非INT,如果非負則加上UNSIGNED。但對整數類型指定寬度,比如INT(11),沒有任何用,因爲指定的類型標識範圍已經確定;
  • VARCHAR的長度只分配真正需要的空間;
  • 儘量使用TIMESTAMP而非DATETIME,但TIMESTAMP只能表示1970 - 2038年,比DATETIME表示的範圍小得多,而且TIMESTAMP的值因時區不同而不同;
  • 單表不要有太多字段,建議在20以內;
  • 合理的加入冗餘字段可以提高查詢速度。

表拆分

垂直拆分

垂直拆分按照字段進行拆分,其實就是把組成一行的多個列分開放到不同的表中,這些表具有不同的結構,拆分後的表具有更少的列。例如用戶表中的一些字段可能經常訪問,可以把這些字段放進一張表裏。另外一些不經常使用的信息就可以放進另外一張表裏。

插入的時候使用事務,也可以保證兩表的數據一致。缺點也很明顯,由於拆分出來的兩張表存在一對一的關係,需要使用冗餘字段,而且需要join操作。但是我們可以在使用的時候可以分別取兩次,這樣的來說既可以避免join操作,又可以提高效率。

水平拆分

水平拆分按照行進行拆分,常見的就是分庫分表。以用戶表爲例,可以取用戶ID,然後對ID取10的餘數,將用戶均勻的分配進這 0-9這10個表中。查找的時候也按照這種規則,又快又方便。

有些表業務關聯比較強,那麼可以使用按時間劃分的。例如每天的數據量很大,需要每天新建一張表。這種業務類型就是需要高速插入,但是對於查詢的效率不太關心。表越大,插入數據所需要索引維護的時間也就越長。

表分區

分區適用於例如日誌記錄,查詢少。一般用於後臺的數據報表分析。對於這些數據彙總需求,需要很多日誌表去做數據聚合,我們能夠容忍1s到2s的延遲,只要數據準確能夠滿足需求就可以。
MySQL主要支持4種模式的分區:range分區、list預定義列表分區,hash 分區,key鍵值分區。
錄入使用key鍵值分區:

CREATE TABLE `test2` (
  `id` int(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(100) DEFAULT NULL COMMENT '名稱',
  `state` int(1) DEFAULT NULL COMMENT '狀態',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY KEY (id)
PARTITIONS 10;

讀寫分離

大型網站會有大量的併發訪問,如果還是傳統的數據存儲方案,只是靠一臺服務器處理,如此多的數據庫連接、讀寫操作,數據庫必然會崩潰,數據丟失的話,後果更是不堪設想。這時候,我們需要考慮如何降低單臺服務器的使用壓力,提升整個數據庫服務的承載能力。

我們發現一般情況對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大,這樣分析可以採用數據庫集羣的方案。其中一個是主庫,負責寫入數據,我們稱爲寫庫;其它都是從庫,負責讀取數據,我們稱爲讀庫。這樣可以緩解一臺服務器的訪問壓力。

MySql自帶主從複製功能,我們可以使用主從複製的主庫作爲寫庫,從庫和主庫進行數據同步,那麼可以使用多個從庫作爲讀庫,已完成讀寫分離的效果。

數據庫集羣

如果訪問量非常大,雖然使用讀寫分離能夠緩解壓力,但是一旦寫操作一臺服務器都不能承受了,這個時候我們就需要考慮使用多臺服務器實現寫操作。

例如可以使用MyCat搭建MySql集羣,對ID求3的餘數,這樣可以把數據分別存放到3臺不同的服務器上,由MyCat負責維護集羣節點的使用。

總結

數據結構可以優先從表結構優化,數據量大、併發量大可以考慮讀寫分離、數據庫集羣優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章