标签: myisam

当索引不适合key_buffer时,快速MySQL批量加载

这里有一个问题,如何正确配置mysql(myisam)以便快速执行批量插入(加载数据infile).

有6个Gb文本文件要导入,15个行,16个列(一些int,一些varchar(255),一个varchar(40),一个char(1)一些datetime,一个mediumtext).

相对my.conf设置:

key_buffer  = 800M
max_allowed_packet = 160M
thread_cache_size = 80
myisam_sort_buffer_size = 400M
bulk_insert_buffer_size = 400M
delay_key_write = ON
delayed_insert_limit = 10000
Run Code Online (Sandbox Code Playgroud)

有三个索引 - 一个主要(autincrement int),一个唯一int和一个唯一varchar(40).

问题是在执行load data infile命令后,快速导入前3个数据(基于table.myd增加的大小 - 5-8 mb/s),但是超过3020 Mb的uppon限制了导入速度大大减少 - table.myd的大小增加了0.5mb/s.我注意到,导入过程会Key_blocks_unused因为排空到零而减慢.这些是mysql> show status like '%key%';导入开头的输出:

mysql> show status like '%key%';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| Com_preload_keys       | 0       | 
| Com_show_keys          | 0       | 
| Handler_read_key       | 0       | 
| Key_blocks_not_flushed | 57664   | 
| Key_blocks_unused      | …
Run Code Online (Sandbox Code Playgroud)

mysql myisam bulkinsert

5
推荐指数
1
解决办法
4071
查看次数

InnoDB或MyISAM - 为什么不两者兼而有之?

我已经阅读过关于哪个InnoDB和哪个更好的线程MyISAM.似乎辩论是使用或其他.是否不可能同时使用两者,具体取决于表格?

这样做的缺点是什么?据我所知,可以在CREATE TABLE命令期间设置引擎.因此,经常读取的某些表可以设置为MyISAM,但需要事务支持的表可以使用InnoDB.

mysql database database-design myisam innodb

5
推荐指数
1
解决办法
2212
查看次数

MySQL MyISAM数据丢失的可能性?

许多站点和脚本仍然使用MySQL而不是PostgreSQL.我有几个低优先级的博客,所以我不想迁移到另一个数据库,所以我使用MySQL.

这是问题,他们在低内存VPS上.这意味着我无法启用InnoDB,因为它只使用大约80MB的内存来加载.所以我不得不冒险运行MyISAM.

考虑到这一点,我在MyISAM上看到了什么样的数据丢失?如果因某人保存博客文章而导致电力中断,我会丢失该帖子,还是整个数据库?

在这些低端盒子上,只要整个数据库没有丢失,我就可以丢失一些最近的评论或博客文章.

mysql myisam data-loss

5
推荐指数
2
解决办法
3079
查看次数

无法创建InnoDB表(错误-1)

我正在将一个相当简单的表移植到我的实时数据库服务器上,当我尝试创建一个InnoDB表时,它给了我这个奇怪的错误,表创建是:

CREATE TABLE `cobertura` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `cep` int(8) unsigned zerofill NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `idx_cep` (`cep`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

如果我将引擎更改为MyISAM它可以工作,如果我将表名更改为其他名称,它就可以工作.如果我创建表作为MyISAM并且做一个引擎改为InnoDB我得到错误121.我试着查看mysql存储文件的文件夹,看看那里是否有垃圾,没有.

有任何想法吗?

mysql myisam innodb

5
推荐指数
1
解决办法
1428
查看次数

mysql优化非常大的表

我有一个大约15Gb的MyIsam表.我删除了大约一半的行,删除查询大约需要10个小时.现在我害怕开始optimize table,因为我不知道要花多长时间.如果您有这种大桌子的经验,请与我分享.

PS删除过程后,查询"select*from table limit 0,30"需要数年时间.会有optimize table帮助吗?

需要10个多小时吗?

如果我打断"优化表"查询,会发生什么?

mysql optimization myisam

5
推荐指数
1
解决办法
5441
查看次数

mysql innodb vs myisam插入

我有一张1700万行的表.我需要抓取该表的1列并将其全部插入到另一个表中.这是我做的:

INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001
Run Code Online (Sandbox Code Playgroud)

InnoDB大约需要3分45秒

但是,MyISAM仅在4秒内执行.为什么不同?

我看到每个人都赞扬InnoDB但老实说我不知道​​它对我来说有多好.它慢得多.我知道它对于完整性和诸如此类的东西很有用,但我的许多表都不会被更新(只是阅读).我应该打扰InnoDB吗?

mysql myisam innodb

5
推荐指数
1
解决办法
5184
查看次数

可以将MySQL系统数据库表转换为InnoDB吗?

我最近安装了MySQL 5.5.我正在使用InnoDB我所有数据库的引擎.我注意到mysql数据库默认和所有表(用户,数据库等)都是 MyISAM.有什么理由他们不能/不应该InnoDB?有谁知道MySQL是否需要mysql数据库MyISAM

mysql myisam innodb mariadb

5
推荐指数
1
解决办法
915
查看次数

基于UnixTime的动态MySQL分区

我的数据库设计包括多个MYISAM表,在线收集测量数据,

每行记录包含自动递增的id,一些数据和表示unixtime的整数.

我正在设计一个老化机制,我有兴趣使用MySQL分区动态地基于unixtime对每个这样的表进行分区.

假设我感兴趣的是每个分区将代表单个月的数据,最后一个分区应该代表2个月,如果记录到达下一个未表示的月份,代表2个月的分区应该重新组织以代表单个月,并且新分区应该创建代表2个月(1个从最后一个分区获取,1个用于将来的测量),

此外,当创建新分区时,我感兴趣的是将丢弃最旧的分区.

  1. 我应该使用什么类型的分区(我的unixtime不是唯一的密钥,我如何使用unixtime进行分区)?
  2. 如何根据添加到表中的新记录将分区设计为完全动态?

更新12.12.12

我找到了有趣的链接到类似的方法,我已经描述了你的魔法范围分区维护查询.

mysql myisam partitioning dynamic unix-timestamp

5
推荐指数
1
解决办法
7462
查看次数

使用InnoDB中的自动增量行为模拟MyISAM的复合主键

在MySQL中,如果你有一个MyISAM表,它看起来像:

CREATE TABLE `table1` (
`col1` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`col2` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`col2`, `col1`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;
Run Code Online (Sandbox Code Playgroud)

如果插入行,则自动增量基础对于每个不同的col2值都是唯一的.如果我的解释不够清楚,这个答案应该更好地解释.但是,InnoDB不遵循这种行为.事实上,InnoDB甚至不会让你把col2放在主键定义的第一位.

我的问题是,是否有可能以某种方式在InnoDB中建模这种行为而不诉诸MAX(id)+1或类似的方法?我能找到的最接近的是这个,但它适用于PostgreSQL.

编辑:标题拼写错误

mysql database-design myisam innodb

5
推荐指数
1
解决办法
1012
查看次数

从VARCHAR列中删除一些数据后,为什么MySQL MyISAM表的大小相同?

我需要减小MySQL数据库的大小.我记录了一些条纹';'的信息.和sources列中的':' (减少约10%).执行此操作后,表的大小与之前完全相同.这怎么可能?我正在使用MyISAM引擎.

顺便说一句:不幸的是,我无法压缩表格myisampack.

mysql> INSERT INTO test SELECT protid1, protid2, CS, REPLACE(REPLACE(sources, ':', ''), ';', '') FROM homologs_9606; 
Query OK, 41917131 rows affected (4 min 11.30 sec)
Records: 41917131  Duplicates: 0  Warnings: 0

mysql> select TABLE_NAME name, ROUND(TABLE_ROWS/1e6, 3) 'million rows', ROUND(DATA_LENGTH/power(2,30), 3) 'data GB', ROUND(INDEX_LENGTH/power(2,30), 3) 'index GB' from information_schema.TABLES WHERE TABLE_NAME IN ('homologs_9606', 'test') ORDER BY TABLE_ROWS DESC LIMIT 10;
+---------------+--------------+---------+----------+
| name          | million rows | data GB | index GB |
+---------------+--------------+---------+----------+ …
Run Code Online (Sandbox Code Playgroud)

mysql varchar myisam size-reduction

5
推荐指数
1
解决办法
348
查看次数