【老葉觀點】除了常見的建議外,還有其他幾個要點:
6.1、用INT UNSIGNED存儲IPV4地址,用INET_ATON()、INET_NTOA()進行轉換,基本上沒必要使用CHAR(15)來存儲。
6.2、枚舉類型可以使用ENUM,ENUM的內部存儲機制是采用TINYINT或SMALLINT(并非CHAR/VARCHAR),性能一點都不差,記住千萬別用CHAR/VARCHAR 來存儲枚舉數據。
6.3、還個早前一直在傳播的“常識性誤導”,建議用TIMESTAMP取代DATETIME。其實從5.6開始,建議優先選擇DATETIME存儲日期時間,因為它的可用范圍比TIMESTAMP更大,物理存儲上僅比TIMESTAMP多1個字節,整體性能上的損失并不大。
6.4、所有字段定義中,默認都加上NOT NULL約束,除非必須為NULL(但我也想不出來什么場景下必須要在數據庫中存儲NULL值,可以用0來表示)。在對該字段進行COUNT()統計時,統計結果更準確(值為NULL的不會被COUNT統計進去),或者執行 WHERE column IS NULL 檢索時,也可以快速返回結果。
6.5、盡可能不要直接 SELECT * 讀取全部字段,尤其是表中存在 TEXT/BLOB 大列的時候。可能本來不需要讀取這些列,但因為偷懶寫成 SELECT * 導致內存buffer pool被這些“垃圾”數據把真正需要緩沖起來的熱點數據給洗出去了。