列選擇原則:1:字段型別優先順序 整型 > date,整型》浮點型,time > enum,char
>
varchar
>
blob
列的特點分析:
整型: 定長,沒有國家
/地區之分,沒有字符集的差異
time定長,運算快,節省空間. 考慮時區,寫sql時不方便
where
> 『2005-10
-12』;enum: 能起來約束值的目的, 內部用整型來儲存,但與char聯查時,內部要經歷串與值的轉化
char
定長, 考慮字符集和(排序)校對集
varchar
, 不定長 要考慮字符集的轉換與排序時的校對集,速度慢.
text
/blob 無法使用記憶體臨時表
附: 關於date
/time的選擇,大師的明確意見
性別: 以utf8為例
char(1
) , 3個字長位元組
enum(『男』,』女』);
//內部轉成數字來存,多了乙個轉換過程
tinyint() , //01
2//定長1個位元組.
2: 夠用就行,不要慷慨 (如smallint,varchar
(n))
原因: 大的字段浪費記憶體,影響速度,
以年齡為例
tinyint unsigned not
null
,可以儲存255歲,足夠. 用int浪費了3個位元組
以varchar(
10) ,varchar(300)儲存的內容相同, 但在表聯查時,varchar(300
)要花更多記憶體
3: 盡量避免用null()
原因: null不利於索引,占用的索引空間要大,要用特殊的位元組來標註,在磁碟上佔據的空間其實更大.
實驗:可以建立2張欄位相同的表,乙個允許為null,乙個不允許為null,各加入1萬條,檢視索引檔案的大小. 可以發現,為null的索引要大些.(mysql5.5裡,關於null已經做了優化,大小區別已不明顯)
另外: null也不便於查詢,
where 列名=
null
;
where 列名!=
null
; 都查不到值,
where 列名 is
null ,或is not
null
才可以查詢.
create
table
dictnn (
id int
,word
varchar(14) not
null
default'',
key(word)
)engine myisam charset utf8;
create
table
dictyn (
id int
,word
varchar(14
),key
(word)
)engine myisam charset utf8;
alter
table
dictnn disable keys;
alter
table
dictyn disable keys;
insert
into dictnn select id,if(id%
2,word,'') from dict limit 10000
;insert
into dictyn select id,if(id%
2,word,null) from dict limit 10000
;alert
table
dictnn enable keys;
alter
table
dictyn enable keys;
enum列的說明
1: enum列在內部是用整型來儲存的
2: enum列與enum列相關聯速度最快
3: enum列比(var)char 的弱勢--
-在碰到與char關聯時,要轉化. 要花時間.
4: 優勢在於,當char非常長時,enum依然是整型固定長度.
當查詢的資料量越大時,enum的優勢越明顯.
5: enum與char/varchar關聯 ,因為要轉化,速度要比enum->enum,char
->
char要慢,
但有時也這樣用
-----就是在資料量特別大時,可以節省io.
試驗:create
table
t2 (
id int
,gender enum(
'man
','woman'),
key(gender)
)engine myisam charset utf8;
create
table
t3 (
id int
,gender
char(5) not
null
default'',
key(gender)
)engine myisam charset utf8;
alter
table
t2 disable keys;
alter
table
t3 disable keys;
insert
into t2 select id,if(id%
2,'man
','woman
') from dict limit 10000
;insert
into t3 select id,if(id%
2,'man
','woman
') from dict limit 10000
;alter
table
t2 enable keys;
alter
table
t3 enable keys;
mysql
>
select
count(*) from t2 as ta,t2 as tb where ta.gender=
tb.gender
mysql
>
select
count(*) from t3 as ta,t3 as tb where ta.gender=
tb.gender
列<
---->列 時間
enum<
--->enum 10.53
char
<
---->char 24.65
enum<
---->char 18.22
如果t2表的優勢不明顯, 加大t3的gender列 ,char(15), char(20
)...
隨著t3 gender列的變大,t2表優勢逐漸明顯.
原因--
--無論enum(『manmaman』,』womanwomanwoman』) 列舉的字元多長,內部都是用整型表示, 在記憶體中產生的資料大小不變,而char型,卻在記憶體中產生的資料越來越多.
總結: enum 和enum型別關聯速度比較快
enum 型別 節省了io
網域名稱選取的原則
在選取網域名稱的時候,首先要遵循兩個基本原則。1 網域名稱應該簡明易記,便於輸入 這是判斷網域名稱好壞最重要的因素。乙個好的網域名稱應該短而順口,便於記憶,最好讓人看一眼就能記住,而且讀起來發音清晰,不會導致拼寫錯誤。此外,網域名稱選取還要避免同音異義詞。2 網域名稱要有一定的內涵和意義 用有一定意...
mysql選取某列 MySQL 請選擇合適的列!
字串型別 1 varchar 1 儲存可變長字串。理解 比固定長度占用更少的儲存空間,因為它只占用自己需要的空間。例外情況 使用row format fixed建立的myisam表,它為每行使用固定長度的空間,可能會造成浪費。2 儲存長度資訊。如果定義的列小於或等於255,則使用1個位元組儲存長度值...
mysql動態選取列 在mysql中選擇動態列
是否可以遍歷這樣的表 mysql select from stackoverflow results id type criteria id result 1 car env 1 2 car gas 3 car age 4 bike env 1 5 bike gas 6 bike age 1 7 b...