亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL數據庫開發的36條原則(小結)

2020-01-18 20:41:40
字體:
來源:轉載
供稿:網友

前言

這些原則都是經歷過實戰總結而成

每一條原則背后都是血淋淋的教訓

這些原則主要是針對數據庫開發人員,在開發過程中務必注意

一、核心原則

1.盡量不在數據庫做運算

俗話說:別讓腳趾頭想事情,那是腦瓜子的職責

作為數據庫開發人員,我們應該讓數據庫多做她所擅長的事情:

  • 盡量不在數據庫做運算
  • 復雜運算移到程序端CPU
  • 盡可能簡單應用MYSQL

舉例:

在mysql中盡量不要使用如:md5()、Order by Rand()等這類運算函數

2.盡量控制單表數據量

大家都知道單表數據量過大后會影響數據查詢效率,嚴重情況下會導致整個庫都卡住

一般情況下,按照一年內單表數據量預估:

  • 純INT不超過1000W
  • 含CHAR不超過500W

同時要盡量做好合理的分表,使單表數據量不超載,常見的分表策略有:

  • 通過USERID來分表(根據ID區間分表):在金融行業應用較多,用戶量大、用戶特征明顯
  • 按DATE分表(按天、周、月分表):在電信行業應用非常多,如用戶上網記錄表、用戶短信表、話單表等
  • 按AREA分表(省、市、區分表)
  • 其他

分區表的適用場景主要有:

① 表非常大,無法全部存在內存,或者只在表的最后有熱點數據,其他都是歷史數據;

② 分區表的數據更易維護,可以對獨立的分區進行獨立的操作;

③ 分區表的數據可以分布在不同的機器上,從而高效使用資源;

④ 可以使用分區表來避免某些特殊的瓶頸;

⑤ 可以備份和恢復獨立的分區。

但是使用分區表同樣有一些限制,在使用的時候需要注意:

① 一個表最多只能有 1024 個分區;

② 5.1版本中,分區表表達式必須是整數, 5.5可以使用列分區;

③ 分區字段中如果有主鍵和唯一索引列,那么主鍵列和唯一列都必須包含進來;

④ 分區表中無法使用外鍵約束;

⑤ 需要對現有表的結構進行修改;

⑥ 所有分區都必須使用相同的存儲引擎;

⑦ 分區函數中可以使用的函數和表達式會有一些限制;

⑧ 某些存儲引擎不支持分區;

⑨ 對于 MyISAM 的分區表,不能使用 load index into cache;

⑩ 對于 MyISAM 表,使用分區表時需要打開更多的文件描述符。

3.盡量控制表字段數量

單表的字段數量也不能太多,根據業務場景進行優化調整,盡量調整表字段數少而精,這樣有以下好處:

  • IO高效
  • 全表遍歷
  • 表修復快
  • 提高并發
  • alter table更快

那究竟單表多少字段合適呢?

按照單表1G體積,500W行數據量進行評估:

  • 順序讀1G文件需N秒
  • 單行不超過200Byte
  • 單表不超50個純INT字段
  • 單表不超20個CHAR(10)字段

==>建議單表字段數上限控制在20~50個

4.平衡范式與冗余

數據庫表結構的設計也講究平衡,以往我們經常說要嚴格遵循三大范式,所以先來說說什么是范式:

第一范式:單個字段不可再分。唯一性。

第二范式:不存在非主屬性只依賴部分主鍵。消除不完全依賴。

第三范式:消除傳遞依賴。

用一句話來總結范式和冗余:

冗余是以存儲換取性能,

范式是以性能換取存儲。

所以,一般在實際工作中冗余更受歡迎一些。

模型設計時,這兩方面的具體的權衡,首先要以企業提供的計算能力和存儲資源為基礎。

其次,一般互聯網行業中都根據Kimball模式實施數據倉庫,建模也是以任務驅動的,因此冗余和范式的權衡符合任務需要。

例如,一份指標數據,必須在早上8點之前處理完成,但計算的時間窗口又很小,要盡可能減少指標的計算耗時,這時在計算過程中要盡可能減少多表關聯,模型設計時需要做更多的冗余。

5.拒絕3B

數據庫的并發就像城市交通,呈非線性增長

這就要求我們在做數據庫開發的時候一定要注意高并發下的瓶頸,防止因高并發造成數據庫癱瘓。

這里的拒絕3B是指:

  • 大SQL(BIG SQL):要減少
  • 大事務(BIG Transaction)
  • 大批量(BIG Batch)

二、字段類原則

1.用好數值字段類型

三類數值類型:

  • 整型:TINYINT(1Byte)、TINYINT(1Byte)、SMALLINT(2B)、MEDIUMINT(3B)、INT(4B)、BIGINT(8B)
  • 浮點型:FLOAT(4B)、DOUBLE(8B)
  • DECIMAL(M,D)

以幾個常見的例子來進行說明:

1)INT(1) VS INT(11)

很多人都分不清INT(1)和INT(11)的區別,想必大家也很好奇吧,其實1和11其實只是顯示長度的卻別而已,也就是不管int(x)x的值是什么值,存儲數字的取值范圍還是int本身數據類型的取值范圍,x只是數據顯示的長度而已。

2)BIGINT AUTO_INCREMENT

大家都知道,有符號int最大可以支持到約22億,遠遠大于我們的需求和MySQL單表所能支持的性能上限。對于OLTP應用來說,單表的規模一般要保持在千萬級別,不會達到22億上限。如果要加大預留量,可以把主鍵改為改為無符號int,上限為42億,這個預留量已經是非常的充足了。

使用bigint,會占用更大的磁盤和內存空間,內存空間畢竟有限,無效的占用會導致更多的數據換入換出,額外增加了IO的壓力,對性能是不利的。

因此推薦自增主鍵使用int unsigned類型,但不建議使用bigint。

3)DECIMAL(N,0)

當采用DECIMAL數據類型的時候,一般小數位數不會是0,如果小數位數設置為0,那建議使用INT類型

2.將字符轉化為數字

數字型VS字符串型索引有更多優勢:

  • 更高效
  • 查詢更快
  • 占用空間更小

舉例:用無符號INT存儲IP,而非CHAR(15)

INT UNSIGNED

可以用INET_ATON()和INET_NTOA()來實現IP字符串和數值之間的轉換

3.優先使用ENUM或SET

對于一些枚舉型數據,我們推薦優先使用ENUM或SET,這樣的場景適合:

1)字符串型

2)可能值已知且有限

存儲方面:

1)ENUM占用1字節,轉為數值運算

2)SET視節點定,最多占用8字節

3)比較時需要加‘單引號(即使是數值)

舉例:

`sex` enum('F','M') COMMENT '性別';

`c1` enum('0','1','2','3') COMMENT '審核';

4.避免使用NULL字段

為什么在數據庫表字段設計的時候盡量都加上NOT NULL DEFAULT '',這里面不得不說用NULL字段的弊端:

很難進行查詢優化

NULL列加索引,需要額外空間

含NULL復合索引無效

舉例:

1)`a` char(32) DEFAULT NULL 【不推薦】

2)`b` int(10) NOT NULL 【不推薦】

3)`c` int(10) NOT NULL DEFAULT 0 【推薦】

5.少用并拆分TEXT/BLOB

TEXT類型處理性能遠低于VARCHAR

  • 強制生成硬盤臨時表
  • 浪費更多空間
  • VARCHAR(65535)==>64K(注意UTF-8)

盡量不用TEXT/BLOB數據類型

如果業務需要必須用,建議拆分到單獨的表

舉例:

CREATE TABLE t1 (  id INT NOT NULL AUTO_INCREMENT,  data TEXT NOT NULL,  PRIMARY KEY(id)) ENGINE=InnoDB;

6.不在數據庫里存圖片

先上圖:

可見,如果將圖片全部存在數據庫,將使得數據庫體積變大,會造成讀寫速度變慢。

圖片存數據庫的弊端:

  1. 對數據庫的讀/寫的速度永遠都趕不上文件系統處理的速度
  2. 數據庫備份變的巨大,越來越耗時間
  3. 對文件的訪問需要穿越你的應用層和數據庫層

★推薦處理辦法:數據庫中保存圖片路徑

按照年月日生成路徑。具體是按照年月日還是按照年月去生成路徑,根據自己需要(不一定是按照日期去生成)。

理解為什么要分散到多個文件夾中去才是關鍵,涉及到一個原理就明白了:

操作系統對單個目錄的文件數量是有限制的。當文件數量很多的時候。從目錄中獲取文件的速度就會越來越慢。所以為了保持速度,才要按照固定規則去分散到多個目錄中去。

圖片分散到磁盤路徑中去。數據庫字段中保存的是類似于這樣子的”images/2012/09/25/ 1343287394783.jpg”

原來上傳的圖片文件名稱會重新命名保存,比如按照時間戳來生成,1343287394783. jpg。這樣子是為了避免文件名重復,多個人往同一個目錄上傳圖片的時候會出現。

反正用什么樣的規則命名圖片,只要做到圖片名稱的唯一性即可。

比如網站的并發訪問量大,目錄的生成分得月細越好。比如精確到小時,一個小時都可以是一個文件夾。同時0.001秒有兩個用戶同時在上傳圖片(因為那么就會往同一個小時文件夾里面存圖片)。因為時間戳是精確到秒的。為了做到圖片名稱唯一性而不至于覆蓋,生成可以在在時間戳后面繼續加毫秒微秒等??偨Y的規律是,并發訪問量越大。就越精確就好了。

題外話:

1)為什么保存的磁盤路徑,是”images/2012/09/25/1343287394783.jpg”,而不是” /images/2012/09/25/ 1343287394783.jpg”(最前面帶有斜杠)

在頁面中需要取出圖片路徑展示圖片的時候,如果是相對路徑,則可以使用”./”+”images/2012/09/25/1343287394783.jpg”進行組裝。

如果需要單獨的域名(比如做cdn加速的時候)域名,img1.xxx.com,img2.xxx.com這樣的域名,

直接組裝 “http://img1.xxx.com/”+”images/2012/09/25/1343287394783.jpg”

2)為什么保存的磁盤路徑,是”images/2012/09/25/1343287394783.jpg”,而不是“http://www.xxx.com/images/2012/09/25/1343287394783.jpg"

這里其實涉及到CDN的知識,具體CDN的知識在此不多展開,簡而言之:

cdn服務:對于靜態內容是非常適合的。所以像商品圖片,隨著訪問量大了后,租用cdn服務,只需要把圖片上傳到他們的服務器上去。

例子:北京訪問長沙服務器,距離太遠。我完全可以把商品圖片,放到北京的云服務(我覺得現在提供給網站使用的云存儲其實就是cdn,給網站提供分流和就近訪問)上去。這樣子北京用戶訪問的時候,實際上圖片就是就近獲取。不需要很長距離的傳輸。

自己用一個域名img.xxx.com來載入圖片。這個域名解析到北京的云服務上去。

做法:數據庫中保存的是” images/2012/09/25/1343287394783.jpg”,

這些圖片實際上不存儲在web服務器上。上傳到北京的cdn服務器上去。

我從數據庫取出來,直接”img.xxx.com/”+” images/2012/09/25/1343287394783.jpg”

比如如果還有多個,就命名img1.xx.com、img2.xx.com

反正可以隨便。所以如果把域名直接保存進去。就顯得很麻煩了。遷移麻煩。

三、索引類原則

1.謹慎合理添加索引

  • 添加索引是為了改善查詢
  • 添加索引會減慢更新
  • 索引不是越多越好
  • 能不加的索引盡量不加(綜合評估數據密度和數據分布,最好不超過字段數20%)
  • 結合核心SQL有限考慮覆蓋索引

舉例:不要給“性別”列創建索引

理論文章會告訴你值重復率高的字段不適合建索引。不要說性別字段只有兩個值,網友親測,一個字段使用拼音首字母做值,共有26種可能,加上索引后,百萬加的數據量,使用索引的速度比不使用索引要慢!

為什么性別不適合建索引呢?因為你訪問索引需要付出額外的IO開銷,你從索引中拿到的只是地址,要想真正訪問到數據還是要對表進行一次IO。假如你要從表的100萬行數據中取幾個數據,那么利用索引迅速定位,訪問索引的這IO開銷就非常值了。但如果你是從100萬行數據中取50萬行數據,就比如性別字段,那你相對需要訪問50萬次索引,再訪問50萬次表,加起來的開銷并不會比直接對表進行一次完整掃描小。

2.字符字段必須建前綴索引

區分度:

單字母區分度:26

4字母區分度:26*26*26*26 = 456,976

5字母區分度:26*26*26*26*26 = 11,881,376

6字母區分度:26*26*26*26*26*26 = 308,915,776

字符字段必須建前綴索引,例如:

`pinyin` varchar(100) DEFAULT NULL COMMENT '小區拼音', KEY `idx_pinyin` (`pinyin`(8)), ) ENGINE=InnoDB

3.不在索引列做運算

原因有兩點:

1)會導致無法使用索引

2)會導致全表掃描

舉例:

BAD SAMPLE:

select * from table WHERE to_days(current_date) 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

韩国v欧美v日本v亚洲| 91国偷自产一区二区三区的观看方式| 亚洲女人被黑人巨大进入al| 97视频在线观看免费高清完整版在线观看| 欧美日韩中文在线观看| 久久综合伊人77777尤物| 欧美日韩美女在线观看| 国产精品丝袜视频| 日本久久久a级免费| 成人免费黄色网| 国产成人激情小视频| 精品久久久香蕉免费精品视频| 日韩视频免费中文字幕| 久久精品影视伊人网| 久久久久国产一区二区三区| 久久久久中文字幕| 中文字幕视频在线免费欧美日韩综合在线看| 97在线免费视频| 国产精品91久久| 日本高清视频精品| 国内外成人免费激情在线视频| 国内精品久久久久久中文字幕| 欧美一级免费视频| 操日韩av在线电影| 久久99精品视频一区97| 青青草原成人在线视频| 国产精品你懂得| 国产精品日日摸夜夜添夜夜av| 热re99久久精品国产66热| 亚洲第一男人天堂| 精品国产乱码久久久久久虫虫漫画| 欧美视频在线看| 亚洲综合自拍一区| 亚洲aⅴ男人的天堂在线观看| 成人欧美一区二区三区黑人| 亚洲欧美一区二区激情| 日韩av综合中文字幕| 久久久成人精品视频| 日韩中文在线视频| 亚洲精品国产美女| 久久免费福利视频| 国产精品国产自产拍高清av水多| 亚洲一区中文字幕在线观看| 久久福利视频网| 国产精品入口免费视频一| 日韩精品极品视频| 亚洲97在线观看| 亚洲久久久久久久久久| 国产日韩精品入口| 欧美另类极品videosbestfree| 亚洲欧洲美洲在线综合| 久久亚洲精品成人| 日韩成人中文电影| 成人午夜一级二级三级| 欧美性xxxxxxxxx| 欧美激情xxxx| 国产日韩精品在线观看| 欧美黑人极品猛少妇色xxxxx| 中文字幕在线观看亚洲| 自拍亚洲一区欧美另类| 欧美做受高潮电影o| 国产在线观看91精品一区| 成人国产精品一区二区| 日韩网站在线观看| 国产欧美日韩中文| 免费不卡在线观看av| 中文字幕最新精品| 色噜噜亚洲精品中文字幕| 久久精品国产亚洲精品| 亚洲人高潮女人毛茸茸| 久久在精品线影院精品国产| 亚洲黄色在线观看| 国产精品第二页| 久久综合久中文字幕青草| 91国产一区在线| 亚洲日本欧美日韩高观看| 狠狠躁天天躁日日躁欧美| 免费不卡欧美自拍视频| 国产精品99导航| 68精品国产免费久久久久久婷婷| 大荫蒂欧美视频另类xxxx| 91免费的视频在线播放| 国产成人福利网站| 日韩欧美极品在线观看| 亚洲女人天堂成人av在线| 136fldh精品导航福利| 亚洲精品国产综合久久| 久久国产加勒比精品无码| 国产精品久久一| 日韩欧美一区二区三区| 欧美精品在线第一页| 91精品国产777在线观看| 欧美日韩国产91| 色综久久综合桃花网| 久久人人爽国产| 国产香蕉精品视频一区二区三区| 国产精品三级网站| 国产91精品久久久久久久| 久久偷看各类女兵18女厕嘘嘘| 欧美在线视频在线播放完整版免费观看| 亚洲视频777| 成人欧美一区二区三区在线| 中文字幕国产亚洲| 国产这里只有精品| 亚洲一区二区中文字幕| 亚洲欧洲免费视频| 欧美激情精品久久久久| 久久久精品中文字幕| 大胆人体色综合| 色综合色综合久久综合频道88| 亚洲区中文字幕| 欧美一区二区三区四区在线| 在线播放国产一区中文字幕剧情欧美| 日韩av一区在线| y97精品国产97久久久久久| 奇门遁甲1982国语版免费观看高清| 亚洲人午夜色婷婷| 欧美一级淫片播放口| 久久99精品国产99久久6尤物| 欧美限制级电影在线观看| 欧美性猛交xxxx免费看漫画| 国产精品久久久久久网站| 美女久久久久久久久久久| 97香蕉久久超级碰碰高清版| 精品国产一区二区三区久久狼黑人| 97久久超碰福利国产精品…| 亚洲国产婷婷香蕉久久久久久| 亚洲午夜性刺激影院| 久久国产精品首页| 91亚洲精品久久久久久久久久久久| 久久亚洲精品国产亚洲老地址| 亚洲精品www久久久| 欧美成人亚洲成人日韩成人| 亚洲精品美女视频| 日本精品va在线观看| 亲子乱一区二区三区电影| 精品福利一区二区| 欧美中文字幕视频在线观看| …久久精品99久久香蕉国产| 91高清视频在线免费观看| 97久久国产精品| 青青草成人在线| 国产精品久久久久久网站| 欧美不卡视频一区发布| 国产亚洲欧美aaaa| 精品国产一区二区三区久久久狼| 日韩高清av一区二区三区| 久久视频免费观看| 久久久人成影片一区二区三区| yw.139尤物在线精品视频| 欧美成人午夜免费视在线看片| 国产精品h片在线播放| 精品久久久久久中文字幕| 久久久亚洲欧洲日产国码aⅴ| 国产精欧美一区二区三区| 欧美激情视频播放| 欧美成人午夜剧场免费观看| 成人情趣片在线观看免费| 欧美成人在线免费视频| 国产精品国产三级国产专播精品人| 亚洲精品免费网站| 国产精品爱啪在线线免费观看| 久久久久久国产三级电影| 国产欧美一区二区三区久久人妖|