mysql設計表時註意事項
說明:本文是對項目過程中的一些要求的簡單匯總整理,主要是供個人本身參考。。。
一、表設計
1、
在創建表結構時,表名、字段需要見名知意,不采用拼音
create table `tb_abc` (
`id` int(10) unsigned not null auto_increment comment "此處寫你的註釋",
`name` varchar(50) not null comment ‘此處寫你的註釋‘,
)engine=innodb default charset=utf8mb4 comment ‘此處寫你的註釋‘;
一定要有主鍵!一定要有主鍵!
整形自增(一般用無業務意義的id)(用mycat如有自增功能,就不需要在表結構裏邊定義自增)。
不要在字段裏邊自己定義字符集
字段和表要有comment
2、
首先明確規定:函數,觸發器,視圖,外鍵;所有邏輯業務上實現,盡量不使用存儲過程,
a) 一定使用innodb 引擎,不允許用myisam。
b) 業務表設計時必須包含日期字段,createitme和lastupdatetime
每個表的update 語句,必須包含對 UpdateTime的更新
所有字段建議為not null , 時間類型必須為not null
c) 必須要有主鍵,主鍵盡量用自增字段類型,推薦類型為 INT或者 BIGINT類型。
d) 需要多表 join的字段,數據類型保持絕對一致。
e) 當表的字段數較多時,將表分成兩張表,一張作為條件查詢表,一張作為詳細內容表。
f) 當字段的類型為枚舉型或布爾型時,建議使用 tinyint類型。(不用char或者varchar)
3、
一定要整形ID作為主鍵(沒有主鍵的表有嚴重性能問題)
字段類型越短越好
常見字段類型(一般不允許用text和blob),若必須使用則拆分到單獨的表
盡量不要使用default null,字段都定義為:not null default ‘合理默認值’
4、
為什麽字段類型越短越好(能用整形的盡量用整形,比如tiny代替char(1))等
1> 更少的存儲空間
2>更少的磁盤IO
3> 更少的網絡IO
4>更少的MySQL計算空間
5> 更少的APP計算空間
6>整形存儲和運算代價比字符型小
有text字段的,最好請分表。(本質上說,不是mysql不適合存儲text,而是在太多的情況下我們期望mysql能夠更加高效的提供小數據查詢/事務處理)
表字段數要少而精
5、
為什麽必須有自增整形主鍵,一般該字段沒有業務意義;少用唯一鍵。
6、
為什麽盡量不要使用default null ?
1> 索引不會包括NULL值。影響索引的統計信息,影響優化器的判斷。
2>復合索引中只要有一列含有NULL值,那麽這一列對於此復合索引就是無效的。
3> 所以我們在數據庫設計時不要讓字段的默認值為NULL。
字段統一加上not null default ‘合理默認值’
7、
常見問題一——int(10)和int(2)區別
有別於char(x)和varchar(x),int(x)中的x表示的是整型(tinyint smallint mediumint int bigint)在添加了zerofill描述符後的顯示寬度,所以在不添加zerofill描述符的時候,int(1) 和int(10) int(100) 都沒什麽區別。
8、
常見問題二——怎麽存儲IP
用什麽字段類型存儲IP,char(15),varchar(15)還是int unsigned?
9、
常見問題三——亂用字段類型
1>所有字符串都用varchar(255)------------>給合適長度就好
2>所有的數字都用bigint------->給合適類型,比如tinyint、smallint等
3>所有數字都用decmal-------->不精確值,可以使用其他浮點型,或者用整形來代替
二、索引
1、
開發人員要考慮到常用什麽sql,一定要加上index。不能只是一個表只有一個主鍵。
● 不要修改聚集索引(主鍵)
為了維持B+tree會帶來大量的數據移動,所以一般要求使用跟業務不相關的id做一個整形自增主鍵
● 索引不是越多越好,盡量合並索引
1>索引加快了查詢度,但是卻會影響寫入性能。
2> 一個表的索引應該結合這個表相關的所有SQL綜合創建,盡量合並。
3>組合索引的原則是,過濾性越好的字段越靠前。
例如key (a)和key(a,b)存在,那麽key(a)可以刪除了,對於select ……from tb where a=123;可以用到索引(a,b)
● 不要給選擇性低的字段建單列索引
MySQL對索引的過濾性有要求,如果過濾性太低MySQL會放棄使用。
● 不要使用外鍵約束
1> 對性能損耗特別大。
2>讓應用程序去維護約束。
● 字符類型字段盡量使用前綴索引
太長的索引不僅影響寫入性能,而且使用效果也差,因此字符串類型字段一般只建前綴索引
alter table test_long_str add index idx_str(str(16));
● 合理使用復合索引
● LIKE查詢的索引問題
like只能使用前綴索引,因此 :
1>col like "abc%" 能用上索引
2>col like "%abc%" 不能能用上索引
3>col like "%abc" 不能能用上索引
2、
三、SQL優化或規範
mysql設計表時註意事項