思想:硬碟如倉庫,表如倉庫中貨架(常用與不常用等分類),欄位如貨物(尺寸是固定或變動),訪問貨物涉及到貨架的佔位、效率。
資料型別選用,建表思路,正規化
資料型別特點
資料型別的速度關係
[ 最快 ] 整形 > date,time > char,enum > varchar > text ,blob [ 最慢 ]
char 與 varchar 選擇
一般情況下,在100個字元內,可以使用 char 定義。(少量字元在使用率上,定長比變長更具有硬碟效能和低損耗【變長需要根據具體長度計算偏移量】的優勢)
資料型別的特點
char(1):需要經過字符集的轉換(排序時涉及字符集校對)。
enum('男','女'):內部使用數值儲存,多了乙個數值轉換
tinyint:無需字符集轉換,直接參與算術運算(cpu內部最基礎的就是算術及邏輯運算),速度更快
舉例應用:性別(tinyint > enum > char)
夠用就好
越大的字段越浪費記憶體,從而影響效能(無論從磁碟載入到記憶體的時間,以及記憶體管理)
null 盡量避免少用
不利於索引
不利於查詢:需要專用的關鍵字實現(is)。例如 where name is null 或 where name != null
不利用邏輯:select null = null ;
小數類double,float 精度有誤差(有四捨五入的特點),不適合作為金額儲存
decimal 沒有精度誤差,適合作為金額儲存
日期時間 時間戳 整形
效能:整形(int,bigbit) > 時間日期(datetime) > 時間戳(timestamp)
跨時區:
datetime --> 時間戳 --> 指定時區。不做任何改變,儲存與查詢一致。
timestamp 按當前環境的時區儲存,查詢按客戶端當前時區返回。(檢視mysql時區變數:select variables like '%time_zone%';)
時間支援:
datetime 支援 9999-12-31 23:59:59
timestamp / int 支援 2038-01-19 03:14:07
綜合:使用 datetime 比較省心
建表思路
定長與變長分離。
常用與不常用分離。
高頻率用到的資訊優先思考效率,不常用的資訊優先考慮空間占用。
1對多的關係中,新增冗餘字段(這與正規化有點違背,但能解決聯表查詢的效能消耗)。如:聯表。
列 型別 注釋
id int unsigned primary key
username varchar(20) -- 優化 --> char(20)
gender char(1) -- 優化 --> tinyint
weight tinyint unsigned
birth date
salary decimal(8,2)
lastlogin datetime
intro varchar(1500) -- 優化 --> 將 intro 字段分離該錶,另外形成乙個新的表(id,username,is_del,intro)
is_del tinyint 是否邏輯刪除(1:真)
正規化正規化:1nf -> 2nf -> 3nf -> bcnf -> 4nf -> 5nf
實際應用中,使用 3nf 或 bcnf(bcnf可理解為 3nf的補丁版) 已經能夠得到很好的結果。4nf以上的正規化是特殊情況下才使用。
1nf:若資料表 r 的每乙個欄位的值為單一的,則 r 屬於【第一階規範化形式】(first normal form)
函式依賴:r(列1,列2,…,列n)為一資料表,且 x,y 為 的部分集合,若找不到兩處記錄,其 x 值相同,y值不同,則 x 功能上確定 y 或 y 函式依賴於 x 。(即 x 字段內容相同記錄,y 字段內容也一樣)。如:身份證號(x) 確定了 姓名(y)
主鍵:r(列1,列2,…,列n)為一資料表,且 x 為的部分集合;若資料表內所有其他列字段都函式依賴與 x,則 x 為 r 的【主鍵】。
2nf:若資料表r屬於1nf,且所有非主鍵的字段皆【完全函式依賴】於主鍵,則r屬於【第二階規範化形式】(second normal form)
3nf:若資料表r屬於2nf,且所有的非主鍵的字段無【傳遞函式依賴】於主鍵,則r屬於【第三階規範化形式】(third normal form)
2nf,3nf 都是對非主屬性(主鍵)的函式依賴提出的限定,並沒有要求消除主屬性(主關鍵字)對候選關鍵字的傳遞依賴。bcnf為此而生。
bcnf:資料表 r 的所有屬性(含主鍵,非主鍵)都不傳遞依賴於 r 的任何候選關鍵字,則 r 屬於 bcnf。
mysql建表建索引6 mysql建表建索引
建表 create table sj projects id int 11 not null auto increment,title varchar 255 not null default comment 專案名稱 platform id int 11 not null default 0 co...
mysql建立使用者表 mysql 建庫建表建使用者
1.建立資料庫 create database school 2.使用資料庫 use school 3.建立使用者 create user jame localhost identified by jame 4.授權使用者 注意這裡是用了 哦,可以自己講school也替換成 號 grant sele...
mysql建表建索引6 Mysql建表 建立索引
建立表時可以直接建立索引,這種方式最簡單 方便。其基本形式如下 create table 表名 屬性名 資料型別 完整性約束條件 屬性名 資料型別 完整性約束條件 屬性名 資料型別 unique fulltext spatial index key 別名 屬性名1 長度 asc desc uniqu...