1.定長與變長分離
如 id int佔4個位元組,char(4) 佔4個字元長度,也是定長,time即每一單元值佔的位元組是固定的
核心且常用字段,直建成定長,方在一張表上
而 varchar,text,blob這種變長字段,適合單方一章表,用主鍵與核心表關聯起來
2.常用字段要與非常用字段分離
需要結合**的具體業務分析,分析欄位的查詢場景,查詢頻率低的字段單拆出來
3.在1對多需要關聯統計的字段,新增冗餘字段
例如,欄目組要查詢欄目組下面的文章數量,如果沒有冗餘字段,就需要關聯查詢
可以在欄目表中新增章節數量字段,可以避免關聯查詢
1.欄位型別優先順序
整型 > date,time > emum char > varchar > blob,text
2.列特點分析
(1) 整型:定長,沒有國家/地區之分,沒有字符集差異
比如,tinyint 1 2 3 4 <==> char(1) a b c d
從空間上看都是一位元組,但是order by 排序tinyint快
原因:後者需要考慮字符集與校對集(就是排序優先集)
time : 定長運算快,節省時間,考慮時區,寫sql不方便
enum : 能約束值的目的,內部用整形來儲存,但與char聯查時,內部要經歷串與值的轉化
char : 定長,考慮字符集和校對集
varchar : 不定長,要考慮字符集的轉換與排序時的校對集,速度慢
text,blob : 無法使用記憶體臨時表(排序操作只能在磁碟上進行)
注意:date,time的選擇可以直接選擇使用時間戳
char(1),3個位元組
enum("男","女") //內部轉成數字來儲存,多了乙個轉換的過程
tinyint() // 0 1 2 定長1位元組
(2)夠用就行不要慷慨
大的字段影響記憶體影響速度
以年齡為例:tinyint unsigned not null;可以儲存255歲,足夠了,用int浪費3個位元組
以varchar(10),varchar(300)儲存的內容相同,但在表中查詢時,varhcar(300)要花用更多記憶體
(3)盡量避免null()
null不利於索引,要用到特殊位元組來標註
(在磁碟上佔據記憶體更大,mysql5.5已經做過優化,但是還是不便)
null也不便於查詢,=null 或者 != null 都查詢不到值,只有使用 is null 或者 is not null 才可以
可以在建立字段時候使用 not null default "" 的形式
mysql建表原則 mysql優化1 建表原則
建表三大原則 定長和變長分離 常用字段和不常用字段分離 使用冗餘欄位或冗餘表 1 定長與變長分離 如 id int,佔4個位元組,char 4 佔4個字元長度,也是定長,time 即每乙個單元值佔的位元組是固定的。在磁碟上查詢時,由於每一行長度固定,比如長度為10000,查下一條時只需查 10001...
mysql建表效能優化 MYSQL建表優化
除非單錶資料未來會一直不斷 否則不要一開始就考慮拆分,拆分會帶來邏輯 部署 運維的各種複雜度,一般以整型值為主的表在千萬級以下,字串為主的表在五百萬以下是沒有太大問題的。1 字段 a 盡量使用tinyint smallint medium int作為整數型別而非int,如果非負則加上unsigned...
mysql 建表原則 MySql基本的建表原則
1.定長和變長的分離 如int,char,time所佔位元組是固定的字段放在一張表 如varchar,text所佔位元組不確定的字段放在一張表中 2.常用字段和不常用字段進行分離,根據查詢頻率來設計 3.一對多的關聯表可以新增冗餘字段,如商品分類表 和商品表 在首頁中需要顯示每個分類商品總數.解決方...