(1)char和varchar是存储少量的字符串信息
(2)TEXT和BLOB则用于存储较大文件,其中BLOB存储二进制文件(如照片),TEXT存储文本文件(如文章)。
(3)TEXT有多种子类型:TEXT,MEDIUMTEXT,LONGTEXT
(4)BLOB也有多种子类型:BLOB,MEDIUMBLOB,LONGBLOB.
(5)对BLOB和TEXT值操作引起的性能问题:
数据空洞问题 : 尤其是删除操作会造成数据空洞。需要定期用OPTIMIZE TABLE进行碎片整理,清理空洞。
数据空洞的表现为数据已经删除但实际磁盘的物理文件大小没有变化。
清理子句:
OPTIMIZE TABLE tablename;
(6)如何为BLOB和TEXT类型的值建立索引:
答:MySQL提供合成索引(Synthetic)
合成索引:根据大文本字段内容建立一个散列值;将散列值单独存储成一个数据列;通过对散列值的索引进行快速定位。
注1:数值型散列值可以很高效的存储
注2:用散列值标识符查找的速度比搜索BLOB和TEXT本身的速度快太多
注3:合成索引只适合于精确匹配
合成索引使用示例:
表定义:
create table t(
id varchar(100),
context blob,
hash_value() varchar(40));
插入操作:
insert into t
values
(1,repeat('beijing',2),md5(context));
查询操作:
select *
from t
where hash_values=md5(repeat('beijing',2));
也可以使用前缀索引,这样适用模糊匹配:
前缀索引:也就是只为字段的前n列创建索引。
create index idx_blob on t(context(100));
提示1:尽量避免直接检索BOLB和TEXT的值。
提示2:把BLOB和TEXT列分离到单独的表中。