前提:使用適合儲存引擎。
選擇原則:根據選定的儲存引擎,確定如何選擇合適的資料型別。
下面的選擇方法按儲存引擎分類:
對於innodb資料表,內部的行儲存格式沒有區分固定長度和可變長度列(所有資料行都使用指向資料列值的頭指標),因此在本質上,使用固定長度的char列不一定比使用可變長度varchar列簡單。因而,主要的效能因素是資料行使用的儲存總量。由於char平均占用的空間多於varchar,因 此使用varchar來最小化需要處理的資料行的儲存總量和磁碟i/o是比較好的。
下面說一下固定長度資料列與可變長度的資料列。char和varchar型別類似,但它們儲存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在儲存或檢索過程中不進行大小寫轉換。
下面的表顯示了將各種字串值儲存到char(4)和varchar(4)列後的結果,說明了char和varchar之間的差別:
值char(4)
儲存需求
varchar(4)
儲存需求
''' '
4個位元組
''1個位元組
'ab'
'ab '
4個位元組
'ab '
3個位元組
'abcd'
'abcd'
4個位元組
'abcd'
5個位元組
'abcdefgh'
'abcd'
4個位元組
'abcd'
5個位元組
請注意上表中最後一行的值只適用不使用嚴格模式時;如果mysql執行在嚴格模式,超過列長度不的值不儲存
,並且會出現錯誤。
從char(4)和varchar(4)列檢索的值並不總是相同,因為檢索時從char列刪除了尾部的空格。通過下面的例子說明該差別:
mysql> create table vc (v varchar(4), c char(4));
query ok, 0 rows affected (0.02 sec)
mysql> insert into vc values ('ab ', 'ab ');
query ok, 1 row affected (0.00 sec)
mysql> select concat(v, '+'), concat(c, '+') from vc;
+----------------+----------------+
| concat(v, '+') | concat(c, '+') |
+----------------+----------------+
| ab + | ab+ |
+----------------+----------------+
1 row in set (0.00 sec)
在使用text和blob欄位型別時要注意以下幾點,以便更好的發揮資料庫的效能。
①blob和text值也會引起自己的一些問題,特別是執行了大量的刪除或更新操作的時候。
刪除這種值會在資料表中留下很大的"空洞",以後填入這些"空洞"的記錄可能長度不同,為了提高效能,建議定期使用 optimize table 功能對這類表進行碎片整理.
②使用合成的(synthetic)索引。
合成的索引列在某些時候是有用的。一種辦法是根據其它的列的內容建立乙個雜湊值,並把這個值儲存在單獨的資料列中。接下來你就可以通過檢索雜湊值找到資料行了。但是,我們要注意這種技術只能用於精確匹配的查詢(雜湊值對於類似《或》=等範圍搜尋操作符 是沒有用處的)。我們可以使用md5()函式生成雜湊值,也可以使用sha1()或crc32(),或者使用自己的應用程式邏輯來計算雜湊值。請記住數值型雜湊值可以很高效率地儲存。同樣,如果雜湊演算法生成的字串帶有尾部空格,就不要把它們儲存在char或varchar列中,它們會受到尾部空格去除的影響。
合成的雜湊索引對於那些blob或text資料列特別有用。用雜湊識別符號值查詢的速度比搜尋blob列本身的速度快很多。
③在不必要的時候避免檢索大型的blob或text值。
例如,select *查詢就不是很好的想法,除非你能夠確定作為約束條件的where子句只會找到所需要的資料行。否則,你可能毫無目的地在網路上傳輸大量的值。這也是 blob或text識別符號資訊儲存在合成的索引列中對我們有所幫助的例子。你可以搜尋索引列,決定那些需要的資料行,然後從合格的資料行中檢索blob或 text值。
④把blob或text列分離到單獨的表中。
在某些環境中,如果把這些資料列移動到第二張資料表中,可以讓你把原資料表中 的資料列轉換為固定長度的資料行格式,那麼它就是有意義的。這會減少主表中的碎片,使你得到固定長度資料行的效能優勢。它還使你在主資料表上執行 select *查詢的時候不會通過網路傳輸大量的blob或text值。
為了能夠引起大家的重視,在介紹浮點數與定點數以前先讓大家看乙個例子:
mysql> create table test (c1 float(10,2),c2 decimal(10,2));
query ok, 0 rows affected (0.29 sec)
mysql> insert into test values(131072.32,131072.32);
query ok, 1 row affected (0.07 sec)
mysql> select * from test;
+-----------+-----------+
| c1 | c2 |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
1 row in set (0.00 sec)
從上面的例子中我們看到c1列的值由131072.32變成了131072.31,這就是浮點數的不精確性造成的。
在mysql中float、double(或real)是浮點數,decimal(或numberic)是定點數。
浮點數相對於定點數的優點是在長度一定的情況下,浮點數能夠表示更大的資料範圍;它的缺點是會引起精度問題。在今後關於浮點數和定點數的應用中,大家要記住以下幾點:
浮點數存在誤差問題;
對貨幣等對精度敏感的資料,應該用定點數表示或儲存;
程式設計中,如果用到浮點數,要特別注意誤差問題,並盡量避免做浮點數比較;
要注意浮點數中一些特殊值的處理。
Mysql選擇合適的資料型別
一般情況下,由於char是固定長度的,所以它的處理速度比varchar要快的多,但是器缺點是浪費儲存空間,程式需要對行尾空格進行處理,所以對於那些長度變化不大並且對查詢速度有較高要求的詩句可以考慮使用char型別儲存。mysql中不同引擎對varchar和插入的使用原則 myisam 使用固定長度 ...
選擇合適的資料型別
選擇合適的資料型別 char和varchar char是固定長度的字元型別,varchar是可變長度的字元型別,因此char檢索起來速度更快。char由於是固定長度的在檢索的時候刪除了尾部的空格。用text和blob時需要注意的問題有 在執行大量刪除操作的時候會在資料表中留下很大的空洞,以後填入這些...
MySQL學習筆記(六) 選擇合適的資料型別
char和varchar型別相似,都用來儲存字串,但是它們儲存和檢索的方式不同。char屬於固定長度的字元型別,而varchar屬於可變長度的字元型別。由於char是固定長度的,所以它的處理速度比varchar快得多,但是其缺點是浪費儲存空間,程式需要對行尾空格進行處理,所以對那些長度變化不大並且查...