1. 程式人生 > >mysql設計表時註意事項

mysql設計表時註意事項

tls ase rem 前綴 默認 upd cnblogs 允許 字符類

說明:本文是對項目過程中的一些要求的簡單匯總整理,主要是供個人本身參考。。。

一、表設計

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設計表時註意事項