1. 程式人生 > >8.Mysql數據類型選擇

8.Mysql數據類型選擇

查看 mys 輸入長度 test index 字節 釋放 files 警告

8.選擇合適的數據類型
8.1 CHAR與VARCHAR
CHAR固定長度的字符類型,char(n) 當輸入長度不足n時將用空格補齊,char(n)占用n個字節,CHAR類型輸出時會截斷尾部的空格,即使是數據值尾部的空格也將會被截斷。CHAR處理速度要快於VARCHAR。
VARCHAR可變長度的字符類型,varchar(n) 當輸入長度不足n時不用補齊,varchar(n)占用實際長度+1個字節,+1個字節是因為VARCHAR值後需要加一個字符串結尾符。VARCHAR類型輸出時會截斷字符串結尾符。
不同存儲引擎下CHAR與VARCHAR的選擇:
MyISAM存儲引擎建議使用CHAR;

MEMORY存儲引擎使用固定長度的數據行存儲,即使列定義為VARCHAR也會被作為CHAR處理;
InnoDB存儲引擎建議使用VARCHAR,所有行都有頭部指針。
8.2 TEXT和BLOB
TEXT和BLOB用於保存大文本,其中:TEXT類型用來保存字符數據,BLOB類型用來保存二進制數據。
TEXT和BLOB的性能考慮:
1.optimize table
在刪除數據後或者將數據由大改小後,數據將被刪除,但空間並不會釋放,這些在表的數據文件內未釋放的空間稱為碎片,碎片對表的性能會產生影響。
optimize table命令可以整理磁盤空間,並釋放碎片。
例子:
create table test10 (id varchar(100),content text);
insert into test10 values (‘1‘,repeat(‘abc‘,100)); -- repeat()函數是循環
insert into test10 values (‘2‘,repeat(‘bcd‘,100));
insert into test10 values (‘3‘,repeat(‘cde‘,100));
-- 查看數據文件 C:\Program Files\MySQL\Data\Data\scott\test10.ibd 96k
delete from test10 where id=1;
-- 查看數據文件
optimize table test10; -- ‘Table does not support optimize, doing recreate + analyze instead‘
-- 查看數據文件
2.合成索引
使用合成索引來提高大文本字段的查詢性能。
合成索引是指根據大文本字段的內容建立一個散列值,並單獨存儲散列值,以散列值來查詢數據行。
註意:只能用於散列值的精確匹配,不能用於範圍匹配。
可以生成散列值的函數包括md5(),sha1(),crc32()等。
例子:
create table test11(id varchar(100),context blob,hash_value varchar(40));
insert into test11 values (1,repeat(‘beijing‘,100),md5(context));
insert into test11 values (2,repeat(‘shanghai‘,100),md5(context));
insert into test11 values (3,repeat(‘guangzhou‘,100),md5(context));
select * from test11;
explain select * from test11 where hash_value=md5(repeat(‘guangzhou‘,100));
3.前綴索引
-- 對context列前100個字符建立索引
create index idx_blob on test11(context(100));
-- 查看執行計劃,前綴索引被查詢使用
explain select * from test11 where context like ‘guangzhou%‘;
4.避免select *
如果不需要返回TEXT和BLOB列時,則避免使用select *,以減少網絡傳輸的數據量。
5.將TEXT和BLOB列拆表
把TEXT和BLOB列分離到單獨的表中,適用於對其他列使用頻繁,對TEXT和BLOB列使用不頻繁的情況下。

8.3 浮點數和定點數
浮點數用於存儲含小數的數值,包括float和double,浮點數精度較低(float 6位,double 15位),超出有效位數將導致四舍五入。
定點數以字符串存儲,數據類型為decimal(65,0~30),超出定義精度時,在SQLMode模式下會警告並四舍五入,在TRADITIONAL模式下報錯無法插入。
精度要求較高時建議選擇定點數decimal(65,0~30)。

8.4 日期類型選擇
根據實際需要選擇能夠滿足應用的最小存儲的日期類型;
只存年,用year;
只存年月日,用date;
只存時分秒,用time;
存年月日時分秒,用datetime,
跨不同時區使用,用timestamp。

8.5 小結

8.Mysql數據類型選擇