0x4*_*672 36 mysql optimization performance
添加新列或添加新索引可能需要数小时或数天才能使MySQL中的大型innodb表行超过1000万行.在这两种情况下,提高大型innodb表的性能的最佳方法是什么?更存储器,调整上述结构(例如增加sort_buffer_size的值或innodb_buffer_pool_size),或某种特技的?可以创建一个新表,更改它,然后将旧数据复制到新表中,而不是直接更改表,这对ISAM表和多个更改很有用:
CREATE TABLE tablename_tmp LIKE tablename;
ALTER TABLE tablename_tmp ADD fieldname fieldtype;
INSERT INTO tablename_tmp SELECT * FROM tablename;
ALTER TABLE tablename RENAME tablename_old;
ALTER TABLE tablename_tmp RENAME tablename;
Run Code Online (Sandbox Code Playgroud)
对于innodb表也是值得推荐的,还是ALTER TABLE命令的用途?
Shl*_*ach 66
编辑2016:我们最近(2016年8月)发布gh-ost,修改我的答案以反映它.
今天有几个工具可以让你在MySQL上进行在线alter table.这些是:
一张大桌子需要很长时间ALTER.innodb_buffer_pool_size很重要,其他变量也很重要,但在非常大的表格上,它们都可以忽略不计.这需要时间.
MySQL对ALTER表的作用是创建一个新格式的新表,复制所有行,然后切换.在此期间,桌子完全锁定.
它很可能会执行最糟糕的选择.这是为什么?因为您正在使用InnoDB表,所以INSERT INTO tablename_tmp SELECT * FROM tablename会产生交易.一笔巨大的交易.它会产生比正常情况更多的负载ALTER TABLE.
此外,你将不得不在那个时候关闭你的应用程序,使其不写(INSERT,DELETE,UPDATE)你的表.如果确实如此 - 您的整个交易毫无意义.
这些工具并非都是一样的.但是,基本知识是共享的:
RENAME.该openark-KIT工具已使用3.5年.Percona工具已有几个月的历史,但可能比前者更耐用.据说Facebook的工具适用于Facebook,但没有为普通用户提供通用解决方案.我自己没有用过它.
编辑2016: gh-ost是一种无触发解决方案,可显着降低主设备上的主写入负载,从而将迁移写入负载与正常负载分离.它是可审计的,可控的,可测试的.我们在GitHub内部开发它并将其作为开源发布; 我们gh-ost今天正在进行所有的生产迁移.在这里查看更多.
每个工具都有自己的局限性,仔细查看文档.
保守的方法是使用主动 - 被动Master-Master复制,ALTER在备用(被动)服务器上执行操作,然后切换角色并ALTER再次执行以前作为活动服务器的操作,现在变为被动.这也是一个不错的选择,但需要额外的服务器,以及更深入的复制知识.
| 归档时间: |
|
| 查看次数: |
22919 次 |
| 最近记录: |