1、一般在保存少量字符串的时候,我们会选择CHAR 或者VARCHAR;而在保存较大文本时,通常会选择使用TEXT 或者BLOB,二者之间的主要差别是BLOB 能用来保存二进制数据,比如照片;而TEXT 只能保存字符数据,比如一篇文章或者日记。TEXT 和BLOB 中有分别包括TEXT、MEDIUMTEXT、LONGTEXT 和BLOB、MEDIUMBLOB、LONGBLOB3 种不同的类型,它们之间的主要区别是存储文本长度不同和存储字节不同,用户应该根据实际情况选择能够满足需求的最小存储类型。本节主要对BLOB 和TEXT 存在的一些常见问题进行介绍。
2 、BLOB 和TEXT 值会引起一些性能问题,特别是在执行了大量的删除操作时。删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上会有影响。为了提高性能,建议定期使用OPTIMIZE TABLE 功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。
OPTIMIZE TABLE 的碎片整理功能。
(1)创建测试表t,字段id 和context 的类型分别为varchar(100)和text:
mysql> create table t (id varchar(100),context text);
(2)往t 中插入大量记录,这里使用repeat 函数插入大字符串:
mysql> insert into t values(1,repeat('haha',100));
mysql> insert into t values(2,repeat('haha',100));
mysql> insert into t values(3,repeat('haha',100));
mysql> insert into t select * from t;
…
mysql> insert into t select * from t;
Query OK, 196608 rows affected (4.86 sec)
Records: 196608 Duplicates: 0 Warnings: 0
(3)退出到操作系统下,查看表t 的物理文件大小:
[linux@yxm test]$ du -sh t.*
125
16K t.frm
155M t.MYD
8.0K t.MYI
这里数据文件显示为155MB。
(4)从表t 中删除id 为“1”的数据,这些数据占总数据量的1/3:
[linux@yxm test]$ mysql -u root -p1234
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 24 to server version: 5.0.45-log
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> use test
Database changed
mysql> delete from t where id=1;
Query OK, 131072 rows affected (4.33 sec)
mysql> exit
Bye
(5)再次退出到操作系统下,查看表t 的物理文件大小:
[linux@yxm test]$ du -sh t.*
16K t.frm
155M t.MYD
8.0K t.MYI
可以发现,表t 的数据文件仍然为155MB,并没有因为数据删除而减少。
(6)接下来对表进行OPTIMIZE(优化)操作:
mysql> use test;
mysql> OPTIMIZE TABLE t;
+--------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------+----------+----------+----------+
| test.t | optimize | status | OK |
+--------+----------+----------+----------+
1 row in set (2.88 sec)
(7)再次查看表t 的物理文件大小:
[linux@yxm test]$ du -sh t.*
16K t.frm
104M t.MYD
8.0K t.MYI
可以发现,表的数据文件大大缩小,“空洞”空间已经被回收。