Char 与 Varchar:
如果插入的字符串后面有空格,因为 char 类型是固定长度,所以会自动删掉后
面的空格。由于是固定长度,所以处理速度 char 比 varchar 快得多,但是缺点是
浪费存储空间,如果数据长度变化不大可以采用。
不同引擎对它的使用原则:
MyISAM:建议使用 Char。
MEMORY:都可以,因为会把他们当做 CHAR 类型处理。
InnoDB:建议使用 Varchar,因为它内部存储数据没有区分固定长度和可变长
度(所有数据行都使用指向数据列的头指针),而 varchar 占用空间少,所以推
荐使用。
Text 与 Blob:
如果保存较大文本一般使用 Text 或 Blob。二者之间的区别在与 Blob 用来保存
二进制数据,比如照片;而 Text 能保存字符数据,如文章。
在执行删除操作时,这 2 种类型会留下很大的“空洞”,以后插入到这些“空
洞”的数据性能上会有影响,所以要定期执行 OPTIMIZE TABLE tablename 对表
进行碎片整理。
可以通过合成的(Synthetic)索引提高大文本的查询性能。
合成索引:所谓合成索引就是根据大文本字段建立一个散列值,并把这个
值保存在单独的数据列中,接下来通过检索散列值找到数据,但是这种技术只
能用于精确匹配。可以用 MD5()或 SHA1()或 CRC32()生成散列值。
例子: Mysql->create table t(id int,content blob,md5_value varchar(50));
Mysql->insert into t values(1,repeat('beijing',5),md5(content));
Mysql->insert into t values(1,repeat('beijing',5),md5(content));
Mysql->insert into t values(1,repeat('beijing 2008',5),md5(content));
通过相应的散列值来查询文本:如
Mysql->select * from t where md5_value=md5(repeat('beijing
2008'),5);
如果需要进行模糊查询,Mysql 提供前缀索引,也就是只为字段前 N 个创建索
引。
Mysql->create index idx_blob on t(content(100));
为文章的前 100 个字符加了索引,就可以使用了 select * from t where content
like 'beijing%';注意%不能放在最前面,否则索引将不会被使用。
浮点数与定点数:
浮点数一般为 float 和 double,当数据精度超过定义的精度一般会进行四舍五入。
定点数实际是以字符串形式保存的,一般为 decimal(或 numberic)。精度比较高,
一般用来保存货币等。
评论0