这里有一个问题,如何正确配置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) 我已经阅读过关于哪个InnoDB和哪个更好的线程MyISAM.似乎辩论是使用或其他.是否不可能同时使用两者,具体取决于表格?
这样做的缺点是什么?据我所知,可以在CREATE TABLE命令期间设置引擎.因此,经常读取的某些表可以设置为MyISAM,但需要事务支持的表可以使用InnoDB.
许多站点和脚本仍然使用MySQL而不是PostgreSQL.我有几个低优先级的博客,所以我不想迁移到另一个数据库,所以我使用MySQL.
这是问题,他们在低内存VPS上.这意味着我无法启用InnoDB,因为它只使用大约80MB的内存来加载.所以我不得不冒险运行MyISAM.
考虑到这一点,我在MyISAM上看到了什么样的数据丢失?如果因某人保存博客文章而导致电力中断,我会丢失该帖子,还是整个数据库?
在这些低端盒子上,只要整个数据库没有丢失,我就可以丢失一些最近的评论或博客文章.
我正在将一个相当简单的表移植到我的实时数据库服务器上,当我尝试创建一个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存储文件的文件夹,看看那里是否有垃圾,没有.
有任何想法吗?
我有一个大约15Gb的MyIsam表.我删除了大约一半的行,删除查询大约需要10个小时.现在我害怕开始optimize table,因为我不知道要花多长时间.如果您有这种大桌子的经验,请与我分享.
PS删除过程后,查询"select*from table limit 0,30"需要数年时间.会有optimize table帮助吗?
需要10个多小时吗?
如果我打断"优化表"查询,会发生什么?
我有一张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 5.5.我正在使用InnoDB我所有数据库的引擎.我注意到mysql数据库默认和所有表(用户,数据库等)都是 MyISAM.有什么理由他们不能/不应该InnoDB?有谁知道MySQL是否需要mysql数据库MyISAM?
我的数据库设计包括多个MYISAM表,在线收集测量数据,
每行记录包含自动递增的id,一些数据和表示unixtime的整数.
我正在设计一个老化机制,我有兴趣使用MySQL分区动态地基于unixtime对每个这样的表进行分区.
假设我感兴趣的是每个分区将代表单个月的数据,最后一个分区应该代表2个月,如果记录到达下一个未表示的月份,代表2个月的分区应该重新组织以代表单个月,并且新分区应该创建代表2个月(1个从最后一个分区获取,1个用于将来的测量),
此外,当创建新分区时,我感兴趣的是将丢弃最旧的分区.
更新12.12.12
我找到了有趣的链接到类似的方法,我已经描述了你的魔法范围分区维护查询.
在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数据库的大小.我记录了一些条纹';'的信息.和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) myisam ×10
mysql ×10
innodb ×5
bulkinsert ×1
data-loss ×1
database ×1
dynamic ×1
mariadb ×1
optimization ×1
partitioning ×1
varchar ×1