我有一个cron脚本,可以创建一个针对站点搜索目的进行优化的mysql表的更新版本。
网站搜索中使用的表格称为 tblSearch
cronjob创建一个新表 wrkSearch ,当它完成填充表结束时
删除tblSearch并重命名 wrkSearch
(两个表都有MySam Engine)
DROP TABLE IF EXISTS `tblSearch
RENAME TABLE `wrkSearch` TO tblSearch
这很好用,但我想知道这个问题是否很好 我想知道您的注意事项是否会因表格大小而发生变化...例如:“解决方案可能对非常大的表格造成危险......”
我知道在mysql表中更改内容的每个查询都是在文件系统上写东西......但是在执行RENAME而不是UPDATE / INSERT之间有什么区别吗?我试图了解RENAME命令是否对文件系统更具 aggresive 。
表上的另一个元素是te数据库使用MASTER-SLAVE结构复制...所以我也想知道这是否最终会影响RENAME查询背后的风险
另一个对我很重要的方面是使用的系统资源量...... RENAME操作可能比UPDATE / INSERT更贪婪吗?
答案 0 :(得分:2)
你应该改变顺序;首先重命名,而不是丢弃:
RENAME TABLE tlbSearch TO tblSearchDropMe, wrkSearch TO tlbSearch;
DROP TABLE tblSearchDropMe;
由于RENAME是原子的,因此其他进程无法访问tblSearch;首次丢弃时,可能会重命名。
除此之外,我没有看到任何与复制相关的问题。
答案 1 :(得分:1)
重命名本身非常快。如果要删除表中的所有内容并将其创建为新的,则此方法很好。 (虽然请检查它确实正确地复制了。)
但是关于复制,这意味着需要传输表的整个数据。
如果可以,最好更新表格中的数据 - 这样只会改变部分数据,而不是一切。
我应该指出,这种操纵是不受欢迎的 - 有充分的理由!但是像所有规则一样,有时你必须打破它们。