MySQL作為關系型數據庫,被用來存儲持久化的數據,避免不了需要創建表。如果沒有利用ORM(對象關系模型)來自動創建表,則需要開發者通過圖形界面(Navicat)或者手寫MySQL語句。
由于在生產環境下,我們對MySQL數據庫的操作通常是通過命令行進行操作,因此,建議建表的時候也手寫MySQL語句(不建議用圖形界面建表)。
1、添加注釋的格式
在編寫MySQL語句時,我們通常會被要求加上注釋,推薦的注釋格式為:

理由:這種注釋格式MySQL解析器也會認為是注釋的,然后,會正確執行你的create table相關語句。我們通常將要更改的sql語句整理到一個1.0.0.sql文件中,然后,你只需要登錄MySQL客戶端,輸入:source /文件目錄/1.0.0.sql。因此,這樣的注釋可以達到一舉兩得的目的。
2、指定表的引擎和缺省的編碼格式以及該表的說明
示例語句如下:

理由:上述顯示的指定使用的引擎為innodb,在5.6之前默認的引擎是MyISAM,而現在主流推薦性能較好的是innodb,具體參考:高性能MySQL 這本書。上述也指定了缺省字符集為utf8,還有不要漏掉使用comment來注釋下這張表的用途,便于其他開發人員了解這張表的意圖。
3、一個經典的建表語句示例并分析
示例語句如下:

需要注意的點如下:
1)所有的字段要加commet注釋
由于我們創建的表也可能被其他人所用,因此加上comment注釋,其他人或者我們自己可以通過命令show create tabletb_example來查看表的結果信息。
2)、int 符號確定
如果確定整形為非負數,就將int設置為無符號型的,即int unsigned,可以多一半的值范圍,又能避免插入負數。int設置為無符號的場景在很多場合都使用。
3)、不定長varchar的長度設置
對于不定長字符串varchar如果不確定字符串長度(且知道字符串長度小于255)可以設置為vachar(255),此時,存儲空間只比正常的多一個字節(與設置varcahr(10)額外存儲的空間是一樣的),又能夠最大限度的利用varchar的特定。注意:超過255則用于存儲該長度的空間會多于一個字節。具體參考:高性能MySQL。
4)、有限狀態的類型設置
對于表示狀態數值的數據類型建議設置為tinyint unsigned(只占用一個字節的空間) 可以表示0到255的范圍。注意:無需用int,占用四個字節的空間。
5)字段創建時間ctime和修改時間mtime
每個表中盡量加上字段創建時間ctime和字段修改時間mtime,便于后期排查問題,知道該條記錄是何時插入,何時修改。
6)、日期時間設置為int時的查詢
這里的ctime表示創建時間,用的是unix時間戳來存儲,但是不能設置缺省值unix_timestamp(),我們在實際查詢的時候,可以使用from_unixtime(ctime)來將unix時間戳轉為date日期格式。
示例如下:

效果如下:

7)所有的字段盡量設置為not null。
8)盡可能的設置default的值
比如:app_name 中通過設置default ‘’,click_cnt設置default ‘0’。
9)將有可能要進行查詢的字段設置為索引
比如:key idx_date(“date”),這里因為可能會查詢一段時間內的數據,因此添加字段“date”的索引。注意:一般索引的命名規則是idx_字段名
10)設置唯一索引
根據業務確定哪些字段或者字段組合的值是唯一的,則將該字段或字段組合設置為唯一索引。
比如:unique keyunique_date_appid(“date”, “app_id”) 這里因為根據業務我們只要對于具體的某一天具體的某個應用的記錄一定只能有一條,因此,設置聯合唯一索引可以防止改天對應的該應用的數據重復插入。注意:唯一索引的命名規則為:unique_字段1_字段2。
11)SQL PRIMARY KEY 約束
PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,并且每個表只能有一個主鍵。
一個小知識點:
由于我們添加了唯一索引unique_date_appid,如果插入重復的date 和 app_id組合,則會報聯合索引重復錯誤,比如,再次執行:

提示:

我們可以通過返回結果result進行判斷,如果result為0,則表示重復插入。