我有一张很大的桌子,有大约100万张唱片。由于性能不好,我优化了查询,需要更改索引。
我用ALTER修改了它,现在我真的不知道它在InnoDB中是如何工作的。是否需要重新启动MySQL服务器?如果我需要重新启动MySQL服务器,如何在表之间保持数据完整性(这样我就不会错过内存中的数据,也不会被写入DB)。
我在谷歌上搜索了一下,发现在MySQL重启的情况下,我需要使用全局变量innodb_fast_shutdown --当我设置它时它会做什么,如果没有呢?这还不是很清楚。
我是新来的MySQL地区的InnoDB。任何帮助都是非常感谢的。
发布于 2013-11-03 08:55:44
所以用
ALTER改变了它,现在我真的不确定它在innodb中是如何工作的?
您是说您添加了ALTER TABLE ... ADD INDEX ... (或者ADD KEY --这是两种要求完全相同的东西)的索引,大概是这样吧?
一旦ALTER TABLE完成执行并返回您的mysql>提示符,就没有其他需要了。此时,表有了新的索引,索引已完全填充。
您已经完成了,并且没有必要重新启动服务器。
既然您提到了这一点,我还将帮助您澄清您对innodb_fast_shutdown和InnoDB中内存/磁盘分隔的误解。
在启动操作系统时,InnoDB向操作系统发出一次innodb_buffer_pool_size大小的内存请求,在本例中,从我的一个测试服务器的MySQL错误日志中请求:
130829 11:27:30 InnoDB: Initializing buffer pool, size = 4.0G这是InnoDB将表和索引数据存储在内存中的地方,最好的性能是当这个池足够大时,可以容纳所有的数据和索引。当读取行时,首先将表空间文件中的页读入缓冲池,然后从缓冲池中提取数据。如果进行更改,则将更改写入缓冲池中表数据和索引的内存中副本,并最终将其刷新到磁盘。池中的页面要么是“干净的”--意思是它们与磁盘上的内容相同,因为它们在加载后没有被更改,或者如果更改了,这些更改已经写入磁盘--或者“脏”表示它们与磁盘上的内容不匹配。
然而,InnoDB是酸-compliant --如果它只在内存中写入更改,并且这些更改没有在内存中的更改发生之前的某个地方持久存在,则这是不可能的.“某处”是重做日志 --在磁盘上--存储内存中要做的更改,立即以一种比实时更新实际表空间文件本身更快的格式进行。
反过来,innodb_fast_shutdown变量确定MySQL是在关闭之前完成写入重做日志的所有操作,还是在启动备份之后完成所有写入重做日志的操作。无论哪种方式,它都可以正常工作,但是如果您需要更快地关闭服务器,那么无论您做了什么更改,让它稍后恢复所有的功能都是更快和非常安全的。
重要的是,我不知道您读过什么,但是在常规操作中,您永远不需要混淆innodb_fast_shutdown的值,除非您正在关闭以准备对您的MySQL服务器版本进行升级(然后这主要是一种安全预防措施)。磁盘上的数据始终与内存中的数据一致,这要么是因为表空间文件已经与数据的内存表示保持一致,要么是因为对表空间文件的挂起的更改被安全地存储在重做日志中,当服务器重新联机时,这些更改将被正确处理。
在ALTER TABLE的情况下,ALTER之前对表的任何挂起的事情都应该已经处理好了,因为InnoDB通常会响应这个命令重新构建整个表,所以唯一可能的“未决”更改是ALTER之后发生的DML。
https://stackoverflow.com/questions/19749930
复制相似问题