研發庫表設計規範

2021-09-11 09:44:55 字數 3761 閱讀 1561

drop table if exists `dictionary`;

create table `dictionary` (

`id` bigint(8) not null auto_increment comment '主鍵',

`create_at` bigint(8) default 0 comment '建立時間',

`create_by` bigint(8) default 0 comment '建立人id',

`create_name` varchar(32) default '' comment '建立人名稱',

`update_at` bigint(8) default 0 comment '更新時間',

`update_by` bigint(8) default 0 comment '更新人id',

`update_name` varchar(32) default '' comment '更新人名稱',

`is_del` tinyint(1) default 0 comment '是否刪除',

`is_test` tinyint(1) default 0 comment '是否測試',

primary key (`id`)

) engine=innodb auto_increment=1 default charset=utf8mb4 collate=utf8mb4_unicode_ci comment='字典';

複製**

不在資料庫做運算:cpu計算務必移至業務層;

控制單錶資料量:含int型不超過1000w,含char則不超過500w;合理分表;限制單庫表數量在300以內;

控制列數量:字段數控制在20以內;

平衡正規化與冗餘:為提高效率犧牲正規化設計,冗餘資料;

拒絕3b:拒絕大sql,大事務,大批量;

用好數值型別

tinyint(1byte)

smallint(2byte)

mediumint(3byte)

int(4byte)

bigint(8byte)

**bad case:**int(1)/int(11)

字元轉化為數字

用int而不是char(15)儲存ip

優先使用enum或set

例如:***enum (『f』, 『m』)

避免使用null欄位

null欄位很難查詢優化

null欄位的索引需要額外空間

null欄位的復合索引無效

bad case:

namechar(32) default null

ageint not null

good case:

ageint not null default 0

少用text/blob

varchar的效能會比text高很多

實在避免不了blob,請拆表

不在資料庫裡存

謹慎合理使用索引

改善查詢、減慢更新

索引一定不是越多越好(能不加就不加,要加的一定得加)

覆蓋記錄條數過多不適合建索引,例如「性別」

字元字段必須建字首索引

不在索引做列運算

bad case:

select id where age +1 = 10;

innodb主鍵推薦使用自增列

主鍵建立聚簇索引

主鍵不應該被修改

字串不應該做主鍵

如果不指定主鍵,innodb會使用唯一且非空值索引代替

不用外來鍵

請由程式保證約束

sql語句盡可能簡單

一條sql只能在乙個cpu運算

大語句拆小語句,減少鎖時間

一條大sql可以堵死整個庫

簡單的事務

事務時間盡可能短

bad case:

上傳事務

避免使用trig/func

觸發器、函式不用

客戶端程式取而代之

不用select *

消耗cpu,io,記憶體,頻寬

這種程式不具有擴充套件性

or改寫為in()

or的效率是n級別

in的效率是log(n)級別

in的個數建議控制在200以內

select id from t where phone=』159′ or phone=』136′;

改寫成:

select id from t where phone in (』159′, 』136′);

or改寫為union

mysql的索引合併很弱智

select id from t where phone = 』159′ or name = 『john』;

改寫成:

select id from t where phone=』159′

union

select id from t where name=』jonh』

避免負向%

慎用count(*)

limit高效分頁

limit越大,效率越低

select id from t limit 10000, 10;

改寫成:

select id from t where id > 10000 limit 10;

使用union all替代union

union有去重開銷

少用連線join

使用group by

分組

自動排序

請使用同型別比較

使用load data導資料

load data比insert快約20倍;

打散批量更新

效能分析工具

show profile;

mysqlsla;

mysqldumpslow;

explain;

show slow log;

show processlist;

show query_response_time(percona)

資料庫建表設計規範

mysql 的字符集支援涉及兩個方面 字符集 character set 和排序方式 collection 對字符集的支援可以細化到四個層次 伺服器 server 資料庫 database 資料表 table 連線 connection 連線mysql 可通過如下命令檢視字符集的詳情 對資料庫的命名...

資料庫設計規範

使用明確 統一的標明和列名,例如 school,schoolcourse,courceid。資料表名使用單數而不是複數,例如 studentcourse,而不是studentcourses。資料表名不要使用空格。資料表名不要使用不必要的字首或者字尾,例如使用school,而不是tblschool,或...

資料庫設計規範

csm簡寫會方便很多 就不要用member id,一致性方便大家理解 system.currenttimemillis 進行儲存text查詢是會產生臨時磁碟檔案,效能差進行擷取儲存型別 占用位元組 範圍tinyint 1 128 127 smallint 2 32768 32767 mediumin...