我有一个非常大的表,大约有1M条记录。由于性能不佳,我优化了查询并需要更改索引。
我使用ALTER
更改了它,现在我真的不确定它在InnoDB中是如何工作的。我需要重启MySQL服务器吗?如果我需要重启MySQL服务器,如何保持表之间的数据完整性(这样我就不会错过内存中没有写入数据的数据)?
我用Google搜索并发现在MySQL重新启动的情况下,我需要使用全局变量innodb_fast_shutdown
- 当我设置它时它会做什么,如果我不这样做呢?现在还不是很清楚。
我是InnoDB的MySQL新手。任何帮助都非常感谢。
答案 0 :(得分:2)
所以使用
ALTER
更改了它,现在我真的不确定它在innodb中是如何工作的?
你是说你用ALTER TABLE ... ADD INDEX ...
(或ADD KEY
- 它们是两种要求完全相同的东西的方式)添加了索引?大概是?
一旦ALTER TABLE
完成执行并且您的mysql>
提示返回,则不需要其他任何内容。此时,表具有新索引,索引已完全填充。
您已完成,无需重新启动服务器。
既然你提到了它,我也会尝试帮助澄清你对InnoDB中innodb_fast_shutdown
和内存/磁盘划分的误解。
当MySQL服务器启动时,InnoDB从操作系统一次性请求一个大小为innodb_buffer_pool_size
的内存块,在本例中来自我的一个测试服务器的MySQL错误日志:
130829 11:27:30 InnoDB: Initializing buffer pool, size = 4.0G
这是InnoDB在内存中存储表和索引数据的地方,最佳性能是当此池足够大以容纳所有数据和索引时。读取行时,首先将表空间文件中的页面读入缓冲池,然后从中提取数据。如果进行了更改,则更改将写入缓冲池中的表数据和索引的内存中副本,并最终刷新到磁盘。池中的页面要么“干净” - 这意味着它们与磁盘上的页面相同,因为它们在加载后没有更改,或者如果更改,则更改已经写入磁盘 - 或“脏”这意味着它们与磁盘上的内容不匹配。
但是,InnoDB
符合ACID - 如果它只在内存中写入更改并且更改未持续立即某处< em>事先甚至在内存中进行了更改......并且“某处”是磁盘上的redo log - 它可以立即存储在内存中进行的更改一种格式,允许此操作比实时更新实际表空间文件本身快得多。
反过来,innodb_fast_shutdown
变量确定MySQL是否在关闭之前完成写入重做日志的所有内容 - 或在它开始备份之后。无论哪种方式,它都可以正常工作,但如果您需要更快地关闭服务器,那么无论您做出哪些更改,都可以更快,更安全地让它在以后选择所有内容。
重要的是,我不知道你读了什么,但在日常操作中,你永远不需要弄乱innodb_fast_shutdown
的值,除非你正在关闭以准备升级你的MySQL版本服务器(然后它主要是一个安全预防措施)。磁盘上的数据始终与内存中的数据一致 ,因为表空间文件已经与数据的内存表示形式一致,或因为表空间文件的挂起更改安全地存储在重做日志中,当服务器重新联机时,它们将被正确处理。
如果ALTER TABLE
ALTER
之前的ALTER
表的任何待处理事件已经处理完毕,因为InnoDB通常会重建整个表以响应此命令,因此唯一可能“待定”更改将是{{1}}之后发生的DML。