1. 程式人生 > >這些年MySQL表設計踩過的坑!

這些年MySQL表設計踩過的坑!

本文首發於個人微信公眾號《andyqian》,期待你的關注!

前言

有朋友在後臺留言。希望我能說說我在資料庫表設計時踩過的坑。那麼,我們今天就來聊聊我在資料庫表設計時踩過的坑,以及現在對資料庫表設計的一點建議。希望能夠幫助到你。

utf8的鍋

場景 : 之前在給客戶做微商城時,需要儲存微信的授權資訊,此時就有一個nickname欄位,在設計資料表時,潛意識的將表的儲存格式設定為utf8,生產上線一段時間後偶爾出現儲存異常。經分析,出現異常的原因是:使用者nickname中有email表情符號。utf8格式的資料表儲存不下導致。

經驗提示: 在設計資料表時,一定要注意該欄位儲存的內容,如果允許設定表情,則一定不能使用utf8,而是使用utf8mb4。

選擇合適的型別

在資料庫表設計時,欄位的型別還真不好設計,這裡簡單說說:

  1. 儲存手機號的欄位,用varchar(20)就已經足夠了,就不應該設計為varchar(100),設定為varchar(100)只會消耗更多的儲存以及記憶體開銷,得不償失啊!
  2. 儲存Boolean型別,使用tinyint就夠了,而不需要設計為int,甚至bigint。

資料型別設計的過大,就會造成沒必要的浪費(磁碟,記憶體,CPU),最主要的是,這是一件費力不討好的事情。

主外來鍵欄位型別不一致

主外來鍵型別不一致,說起來,你可能會不相信,但在資料庫表設計時,稍不留神,就不一致,埋下隱式型別轉換的坑。如下:
使用者表:

create table t_base_user(
oid bigint(20) not null primary key auto_increment comment "主鍵", ....
)

注意此時的主鍵oid為bigint(20)。
使用者地址表:

create table t_base_user_address(
oid bigint(20) not null primary key auto_increment comment "主鍵",
user_id varchar(30) null comment "使用者id" ....
)

你看,此時在t_base_user_address表中的user_id外來鍵欄位,設計時的卻是varchar(30)。你可能覺得你不可能發生這樣的錯誤,說出來也不怕你笑話,我就踩過好幾次這樣的坑,到最後發現慢SQL了,才發現自己中了這樣的坑!!!

註釋

之前在資料庫表設計時,就沒有加註釋的習慣,造成的直接後果是:資料庫設計階段一過,後續資料表的使用中,欄位名就全靠猜了。我們寫程式碼是知道註釋是非常重要的,同樣在設計資料庫表時,註釋也非常重要!一定要記住加註釋,無論是表,還是欄位,索引,都必須加上註釋。
如:

create table t_base_user(
oid bigint(20) not null primary key auto_increment comment "主鍵", ....
)

已有表加註釋

alter table t_base_user modify oid bigint(20) not null primary key auto_increment comment "主鍵";

加註釋時,還要注意的是:在一些需要計算的欄位上,需要加上計算規則文件的連結。方便後續查詢!

加索引

在之前的文章中也有說過,一個好的資料表設計,在一開始就應該考慮新增索引,這個階段新增索引成本不僅最低。而且還不給後續留下慢查詢,甚至生產事故的隱患!索引怎麼加,索引重不重要,可以檢視《寫會MySQL索引》一文進行檢視!唉,我就吃過不少沒加索引或忘記新增索引的虧,記憶猶新!!!

小結

以上是我資料庫設計表時躺過的坑,下面小結精簡版本一下:

  • 允許儲存表情的表,儲存格式設計為utf8mb4,避免使用utf8。
  • 選擇合適的資料型別。
  • 主外來鍵欄位型別一定要一致,否則會造成隱式轉化,不走索引,造成生產事故!
  • 表以及欄位上新增合理的註釋。
  • 資料庫表設計時,一定要在外來鍵欄位以及合適的欄位上加索引。

上面是我資料庫表設計時,遇到踩過坑以後的經驗之談。有些坑當時還真花了不少時間來填補。記錄在這裡,如果能幫助到你,那就太好了!

最後: 祝大家週末愉快!

相關閱讀:

                                                                                               

                                                                                                                    掃碼關注,一起進步

                                                                                                     個人部落格: http://www.andyqian.com