mysql TEXT与BLOB 碎片整理

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
  可以发现,表的数据文件大大缩小,“空洞”空间已经被回收。

原文地址:https://www.cnblogs.com/yangxuming/p/6718490.html