我正在运行带有 InnoDB 表的 Mysql 8。我有一张包含 100k 个小行的表,使用率较高(每秒 10-50 个查询)。
我想使用 将表与其较新版本进行交换RENAME table TO old_table, replacement_table TO table
。正在运行的查询会发生什么?它们会崩溃还是会正常结束?新查询是否等待重命名结束,或者它们可以使用新版本的表,而现有查询则使用旧版本完成?
总的来说,这是一种更新表格的可行方法吗?否则,我需要比较每一行是否有变化,查找新行和已删除的行,因此像这样交换表格似乎要简单得多。
谢谢
该
RENAME
语句需要获取正在重命名的表的元数据锁,DML 语句也一样。因此,它将RENAME
等待轮到自己获取元数据锁,这只有在没有正在运行的引用此表的 DML 语句时才有可能,并且在它执行并持有锁时,其他语句将等待。换句话说,正在运行的语句将在RENAME
开始之前完成,而其他语句将等待直到RENAME
完成。参考