MySQL,longtext、text 还是 blob 哪个更高效?提高插入效率

Posted

技术标签:

【中文标题】MySQL,longtext、text 还是 blob 哪个更高效?提高插入效率【英文标题】:MySQL, which is more efficient longtext, text, or blob? Improving insert efficiency 【发布时间】:2011-10-08 15:23:18 【问题描述】:

我正在将大量数据从多个数据库迁移到一个数据库中。作为中间步骤,我将数据复制到每个数据类型和源数据库的文件中,然后将其复制到新数据库中的大表中。

新表中的结构很简单,称为migrate_data。它由一个 id(主键)、一个 type_id(在数据类型集中递增)、data(一个包含我正在迁移的数据的序列化 php 对象的字段)、source_db(显然是指源数据库)、data_type 组成(确定我们正在查看的数据类型)。

我已经为除数据字段之外的所有内容创建了键和组合键。目前我将数据字段设置为长文本列。用户插入平均需要大约 4.8 秒。我可以在桌子上使用 DELAY_KEY_WRITE=1 将其缩短到 4.3 秒。

我想知道的是是否有办法进一步提高性能。可能通过更改为不同的数据列类型。这就是为什么我询问longtext vs text vs blob的原因。对于这种插入,是否有更有效的方法?

在你回答之前,让我再给你一点信息。我将所有数据发送到一个插入函数,该函数接受对象,通过序列化运行它,然后运行数据插入。它也正在使用 Drupal 6(及其 db_query 函数)完成。

任何效率提升都会很棒。

当前表结构:

CREATE TABLE IF NOT EXISTS `migrate_data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type_id` int(10) unsigned NOT NULL DEFAULT '0',
  `data` longtext NOT NULL,
  `source_db` varchar(128) NOT NULL DEFAULT '',
  `data_type` varchar(128) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `migrated_data_source` (`source_db`),
  KEY `migrated_data_type_id` (`type_id`),
  KEY `migrated_data_data_type` (`data_type`),
  KEY `migrated_data_id__source` (`id`,`source_db`),
  KEY `migrated_data_type_id__source` (`type_id`,`source_db`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 DELAY_KEY_WRITE=1;

【问题讨论】:

【参考方案1】:

各种文本/blob 类型在 PHP 中的存储要求都是相同的,并且执行方式完全相同,只是文本字段需要进行字符集转换。 blob 字段不是。换句话说,blob 用于存储二进制文件时,该二进制文件的输出必须与输入时完全相同。文本字段用于存储可能/可以/将要从一个字符集转换为另一个字符集的文本数据。

【讨论】:

好的,有没有其他方法可以提高插入速度? 并非如此,除非您减少写入的数据量。将数据存储在外部并仅将文件路径/元数据存储在数据库中会更有效。 真的吗???我认为将其存储在文件中会更昂贵。特别是因为我必须批量迁移数据,并且在将数据插入 Drupal 之前,我必须对其进行操作。我看到的问题是系统有时内存不足,如果没有发生这种情况,那么随机 Drupal 函数将超时。到目前为止,我的所有功能都没有超时。但是通过使用数据库,我认为我可以通过将其放入数据库来消除一些资源使用。 想一想:要将文件放入数据库,必须从磁盘读取,强制转换为 mysql 的有线格式,通过有线发送(即使是本地套接字),解码,然后在 mysql 的 innodb/whatever 文件中再次写入磁盘。这与只是将文件移动到驱动器上的某个位置并插入一些元数据相反。 嗯,好的。那么,使用 db 结构作为中间存储获得的唯一好处是搜索能力以及 MySQL 服务器进程将与 Apache/PHP 进程分开运行的事实。因此,在允许的资源范围内为这些特定进程提供了更多的喘息空间。所以你基本上将一些责任转移到 MySQL 服务器进程。

以上是关于MySQL,longtext、text 还是 blob 哪个更高效?提高插入效率的主要内容,如果未能解决你的问题,请参考以下文章

Grails GORM MySQL 生成 TEXT 或 LONGTEXT 列

mysql中text,longtext,mediumtext字段类型的意思,以及区别

MySQL:使用 LONGTEXT 而不是 MEDIUMTEXT 是不是缺乏性能?

mysql中的text长度到底是多少

解决Data too long for column ‘xxx‘ at row 1问题以及深入理解mysql的字符串数据类型(char,varchar,enum,text,longtext...)

Mysql 中的Text字段的范围?与使用方法!