mysql 列的選取原則

2021-09-07 16:25:16 字數 3743 閱讀 5499

列選擇原則:

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...