日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL 那些常見的錯誤設計規范,你都知道嗎

瀏覽:15日期:2023-10-01 09:25:34

依托于互聯網的發達,我們可以隨時隨地利用一些等車或坐地鐵的碎片時間學習以及了解資訊。同時發達的互聯網也方便人們能夠快速分享自己的知識,與相同愛好和需求的朋友們一起共同討論。

但是過于方便的分享也讓知識變得五花八門,很容易讓人接收到錯誤的信息。這些錯誤最多的都是因為技術發展迅速,而且沒有空閑時間去及時更新已經發布的內容所導致。為了避免給后面學習的人造成誤解,我們今天來看一看 MySQL 設計規范中幾個常見的錯誤例子。

主鍵的設計

錯誤的設計規范:主鍵建議使用自增 ID 值,不要使用 UUID,MD5,HASH,字符串作為主鍵

這個設計規范在很多文章中都能看到,自增主鍵的優點有占用空間小,有序,使用起來簡單等優點。

下面先來看看自增主鍵的缺點:

自增值由于在服務器端產生,需要有一把自增的 AI 鎖保護,若這時有大量的插入請求,就可能存在自增引起的性能瓶頸,所以存在并發性能問題; 自增值做主鍵,只能在當前實例中保證唯一,不能保證全局唯一,這就導致無法在分布式架構中使用; 公開數據值,容易引發安全問題,如果我們的商品 ID 是自增主鍵的話,用戶可以通過修改 ID 值來獲取商品,嚴重的情況下可以知道我們數據庫中一共存了多少商品。 MGR(MySQL Group Replication) 可能引起的性能問題;

因為自增值是在 MySQL 服務端產生的值,需要有一把自增的 AI 鎖保護,若這時有大量的插入請求,就可能存在自增引起的性能瓶頸。比如在 MySQL 數據庫中,參數 innodb_autoinc_lock_mode 用于控制自增鎖持有的時間。雖然,我們可以調整參數 innodb_autoinc_lock_mode 獲得自增的最大性能,但是由于其還存在其它問題。因此,在并發場景中,更推薦 UUID 做主鍵或業務自定義生成主鍵。

我們可以直接在 MySQ L使用 UUID() 函數來獲取 UUID 的值。

MySQL> select UUID();+--------------------------------------+| UUID() |+--------------------------------------+| 23ebaa88-ce89-11eb-b431-0242ac110002 |+--------------------------------------+1 row in set (0.00 sec)

需要特別注意的是,在存儲時間時,UUID 是根據時間位逆序存儲, 也就是低時間低位存放在最前面,高時間位在最后,即 UUID 的前 4 個字節會隨著時間的變化而不斷“隨機”變化,并非單調遞增。而非隨機值在插入時會產生離散 IO,從而產生性能瓶頸。這也是 UUID 對比自增值最大的弊端。

為了解決這個問題,MySQL 8.0 推出了函數 UUID_TO_BIN,它可以把 UUID 字符串:

通過參數將時間高位放在最前,解決了 UUID 插入時亂序問題; 去掉了無用的字符串'-',精簡存儲空間; 將字符串其轉換為二進制值存儲,空間最終從之前的 36 個字節縮短為了 16 字節。

下面我們將之前的 UUID 字符串 23ebaa88-ce89-11eb-b431-0242ac110002 通過函數 UUID_TO_BIN 進行轉換,得到二進制值如下所示:

MySQL> SELECT UUID_TO_BIN(’23ebaa88-ce89-11eb-b431-0242ac110002’,TRUE) as UUID_BIN;+------------------------------------+| UUID_BIN |+------------------------------------+| 0x11EBCE8923EBAA88B4310242AC110002 |+------------------------------------+1 row in set (0.01 sec)

除此之外,MySQL 8.0 也提供了函數 BIN_TO_UUID,支持將二進制值反轉為 UUID 字符串。

雖然 MySQL 8.0 版本之前沒有函數 UUID_TO_BIN/BIN_TO_UUID,還是可以通過自定義函數的方式解決。應用層的話可以根據自己的編程語言編寫相應的函數。

當然,很多同學也擔心 UUID 的性能和存儲占用的空間問題,這里我也做了相關的插入性能測試,結果如下表所示:

MySQL 那些常見的錯誤設計規范,你都知道嗎

可以看到,MySQL 8.0 提供的排序 UUID 性能最好,甚至比自增 ID 還要好。此外,由于 UUID_TO_BIN 轉換為的結果是16 字節,僅比自增 ID 增加 8 個字節,最后存儲占用的空間也僅比自增大了 3G。

而且由于 UUID 能保證全局唯一,因此使用 UUID 的收益遠遠大于自增 ID。可能你已經習慣了用自增做主鍵,但是在并發場景下,更推薦 UUID 這樣的全局唯一值做主鍵。

當然了,UUID雖好,但是在分布式場景下,主鍵還需要加入一些額外的信息,這樣才能保證后續二級索引的查詢效率,推薦根據業務自定義生成主鍵。但是在并發量和數據量沒那么大的情況下,還是推薦使用自增 UUID 的。大家更不要以為 UUID 不能當主鍵了。

金融字段的設計

錯誤的設計規范:同財務相關的金額類數據必須使用 decimal 類型 由于 float 和 double 都是非精準的浮點數類型,而 decimal 是精準的浮點數類型。所以一般在設計用戶余額,商品價格等金融類字段一般都是使用 decimal 類型,可以精確到分。

但是在海量互聯網業務的設計標準中,并不推薦用 DECIMAL 類型,而是更推薦將 DECIMAL 轉化為整型類型。 也就是說,金融類型更推薦使用用分單位存儲,而不是用元單位存儲。如1元在數據庫中用整型類型 100 存儲。

下面是 bigint 類型的優點:

decimal 是通過二進制實現的一種編碼方式,計算效率不如 bigint 使用 bigint 的話,字段是定長字段,存儲高效,而 decimal 根據定義的寬度決定,在數據設計中,定長存儲性能更好 使用 bigint 存儲分為單位的金額,也可以存儲千兆級別的金額,完全夠用枚舉字段的使用

錯誤的設計規范:避免使用 ENUM 類型

在以前開發項目中,遇到用戶性別,商品是否上架,評論是否隱藏等字段的時候,都是簡單的將字段設計為 tinyint,然后在字段里備注 0 為什么狀態,1 為什么狀態。

這樣設計的問題也比較明顯:

表達不清:這個表可能是其他同事設計的,你印象不是特別深的話,每次都需要去看字段注釋,甚至有時候在編碼的時候需要去數據庫確認字段含義 臟數據:雖然在應用層可以通過代碼限制插入的數值,但是還是可以通過sql和可視化工具修改值

這種固定選項值的字段,推薦使用 ENUM 枚舉字符串類型,外加 SQL_MODE 的嚴格模式

在MySQL 8.0.16 以后的版本,可以直接使用check約束機制,不需要使用enum枚舉字段類型

而且我們一般在定義枚舉值的時候使用'Y','N'等單個字符,并不會占用很多空間。但是如果選項值不固定的情況,隨著業務發展可能會增加,才不推薦使用枚舉字段。

索引個數限制

錯誤的設計規范:限制每張表上的索引數量,一張表的索引不能超過 5 個

MySQL 單表的索引沒有個數限制,業務查詢有具體需要,創建即可,不要迷信個數限制

子查詢的使用

錯誤的設計規范:避免使用子查詢

其實這個規范對老版本的 MySQL 來說是對的,因為之前版本的 MySQL 數據庫對子查詢優化有限,所以很多 OLTP 業務場合下,我們都要求在線業務盡可能不用子查詢。

然而,MySQL 8.0 版本中,子查詢的優化得到大幅提升,所以在新版本的MySQL中可以放心的使用子查詢。

子查詢相比 JOIN 更易于人類理解,比如我們現在想查看2020年沒有發過文章的同學的數量

SELECT COUNT(*)FROM userWHERE id not in ( SELECT user_id from blog where publish_time >= '2020-01-01' AND publish_time <= '2020-12-31')

可以看到,子查詢的邏輯非常清晰:通過 not IN 查詢文章表的用戶有哪些。

如果用 left join 寫

SELECT count(*)FROM user LEFT JOIN blogON user.id = blog.user_id and blog.publish_time >= '2020-01-01' and blog.publish_time <= '2020-12-31'where blog.user_id is NULL;

可以發現,雖然 LEFT JOIN 也能完成上述需求,但不容易理解。

我們使用 explain查看兩條 sql 的執行計劃,發現都是一樣的

MySQL 那些常見的錯誤設計規范,你都知道嗎

通過上圖可以很明顯看到,不論是子查詢還是 LEFT JOIN,最終都被轉換成了left hash Join,所以上述兩條 SQL 的執行時間是一樣的。即,在 MySQL 8.0 中,優化器會自動地將 IN 子查詢優化,優化為最佳的 JOIN 執行計劃,這樣一來,會顯著的提升性能。

總結

閱讀完前面的內容相信大家對 MySQL 已經有了新的認知,這些常見的錯誤可以總結為以下幾點:

UUID 也可以當主鍵,自增 UUID 比自增主鍵性能更好,多占用的空間也可忽略不計 金融字段除了 decimal,也可以試試 bigint,存儲分為單位的數據 對于固定選項值的字段,MySQL8 以前推薦使用枚舉字段,MySQL8 以后使用check函數約束,不要使用 0,1,2 表示 一張表的索引個數并沒有限制不能超過5個,可以根據業務情況添加和刪除 MySQL8 對子查詢有了優化,可以放心使用。

到此這篇關于MySQL 那些常見的錯誤設計規范的文章就介紹到這了,更多相關MySQL 錯誤設計規范內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
97精品国产福利一区二区三区| 成人看片网站| 视频一区在线播放| 免费国产自线拍一欧美视频| 爽爽淫人综合网网站| 日韩在线视频一区二区三区| 久久狠狠亚洲综合| 国产一区二区视频在线看| 日韩欧美午夜| 性欧美长视频| 国产日韩欧美高清免费| 国产日韩一区二区三区在线播放| 欧美国产不卡| 午夜欧美巨大性欧美巨大| 亚洲免费播放| 亚洲精品大片| 福利欧美精品在线| 中文在线一区| 国产精品欧美大片| 亚洲成av人片一区二区密柚| 中文字幕日韩亚洲| 国产一区二区三区黄网站| 欧美.日韩.国产.一区.二区| 日本vs亚洲vs韩国一区三区二区| 国产精品久久久亚洲一区| 群体交乱之放荡娇妻一区二区| 欧美福利专区| 国产美女精品视频免费播放软件| 成人欧美一区二区三区的电影| 免播放器亚洲一区| 成人片免费看| 日本va欧美va精品| 欧美/亚洲一区| 国产乱人伦精品一区| 国产一在线精品一区在线观看| 91免费精品国偷自产在线在线| 欧美日韩尤物久久| 欧美日韩 国产精品| 亚洲黄页一区| 水蜜桃久久夜色精品一区| 在线精品福利| 久久一区视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 精品捆绑调教一区二区三区| 在线日韩成人| 99成人在线视频| 国产精品magnet| 在线亚洲免费| 欧美13videosex性极品| 国产美女亚洲精品7777| 亚洲欧美视频| 91精品一区二区三区综合在线爱 | 麻豆mv在线观看| 日韩国产欧美在线播放| 亚洲电影在线一区二区三区| 日本久久精品| 欧美经典一区| 日韩精品免费观看视频| 在线一区欧美| 色婷婷久久久| 精品伊人久久久| 国产亚洲久久| 亚洲毛片视频| 狠狠色综合网| 国产综合色区在线观看| 久久99久久久精品欧美| 综合精品一区| 日韩专区一卡二卡| 亚洲一级网站| av亚洲一区二区三区| 久久免费影院| 免费亚洲一区| 欧美视频二区| 日韩福利在线观看| 亚洲人www| 在线视频亚洲欧美中文| 伊人精品视频| 国产精品av一区二区| 在线观看精品| 欧产日产国产精品视频| 国产精品13p| 精品久久亚洲| 国产精品毛片一区二区在线看| 美腿丝袜在线亚洲一区| 国产精品久久久网站| 国产欧美日韩在线观看视频| 日本久久一区| 日本aⅴ亚洲精品中文乱码| 亚洲日本久久| 色综合视频一区二区三区日韩 | 亚洲专区视频| 九一精品国产| 免费国产自久久久久三四区久久 | 久久三级毛片| 精品国产精品国产偷麻豆| 黄色精品视频| 黄毛片在线观看| 91精品蜜臀一区二区三区在线| 国产99亚洲| 亚洲专区欧美专区| 亚洲精品一级二级三级| 日本午夜精品一区二区三区电影| 日本视频中文字幕一区二区三区| 国产精品一区亚洲| 欧美www视频在线观看| 美女av一区| 91一区二区| 婷婷国产精品| 三级亚洲高清视频| 日韩精品91亚洲二区在线观看| 日本强好片久久久久久aaa| 国产日韩一区二区三免费高清 | 亚洲激情另类| 亚洲欧美不卡| 日本综合视频| 欧美国产另类| 黄色网一区二区| 日韩在线看片| 亚洲综合欧美| 国产日韩视频| 中文字幕在线免费观看视频| 国产精品av一区二区| 亚洲一区欧美| 久久精品三级| 精品一区免费| 婷婷五月色综合香五月| 欧美国产视频| 欧美a级一区| 日本亚洲视频在线| 久久精品国产99国产精品| 久久婷婷久久| 最新国产拍偷乱拍精品| 日本在线不卡视频一二三区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 精品久久久中文字幕| 91国语精品自产拍| 91精品国产自产精品男人的天堂| 精品成av人一区二区三区| 欧美理论视频| 日本成人一区二区| 蜜桃av在线播放| 深夜福利一区| 亚洲1234区| 欧美日韩一视频区二区| 精品三级久久| 日韩av一二三| 欧美aa国产视频| 免费在线观看一区| 国产精品日本| 精品国产三区在线| 综合激情网站| 久久久久国产精品一区三寸| 综合亚洲色图| 欧美日韩一区二区三区视频播放| 午夜精品影视国产一区在线麻豆| 亚洲欧洲高清| 国产美女精品视频免费播放软件| 久久精品av| 欧美成人精品一级| 石原莉奈在线亚洲二区| 日本蜜桃在线观看视频| 亚洲三级观看| 欧美日韩精品一区二区视频| 国产精品久久久久久av公交车| 国产一区91| 樱桃视频成人在线观看| 欧美日韩一区二区三区不卡视频 | 欧美激情三区| 亚洲精品成a人ⅴ香蕉片| 欧美日韩一区二区三区视频播放| 麻豆91小视频| 日韩精品高清不卡| 欧美午夜不卡影院在线观看完整版免费| 麻豆中文一区二区| 欧美一区自拍| 亚洲精品免费观看| 国产精品美女久久久| 欧美男人天堂| 久久精品人人| 国产精品一区二区三区美女| 蜜臀久久99精品久久久久宅男| 亚洲一本视频| 秋霞影院一区二区三区| 日韩毛片网站| 伊人国产精品| 欧美中文字幕| 最新日韩av| 亚洲欧美伊人| 亚洲二区精品| 久久精品国产68国产精品亚洲| 成人在线视频免费看| 你懂的亚洲视频| 国产精品亚洲欧美| 国产精品视频一区二区三区综合| 蜜臀av一区二区在线免费观看| 亚洲成人三区| 亚洲黄色影院| 久久国产精品毛片| 欧美不卡视频| 亚洲欧洲一区|