我们有一个运行WordPress 4.8的MariaDB数据库,在wp_options表中发现了很多 transient 命名记录。该表用插件清理,从约800K记录减少到~20K记录。关于该表的查询条目仍然很慢:
# User@Host: wmnfdb[wmnfdb] @ localhost []
# Thread_id: 950 Schema: wmnf_www QC_hit: No
# Query_time: 34.284704 Lock_time: 0.000068 Rows_sent: 1010 Rows_examined: 13711
SET timestamp=1510330639;
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';
找到另一篇文章来创建索引并做了:
ALTER TABLE wp_options ADD INDEX (`autoload`);
这花了太长时间并使网站脱机。我在进程列表中发现了很多'等待表元数据锁'。在取消ALTER TABLE之后,在慢速查询日志中,当然仍然使用高负载和条目再次运行。我还尝试在Web服务器脱机和干净的进程列表的情况下创建索引。如果我今晚再次尝试再创作需要这么长时间吗?
答案 0 :(得分:0)
如果要删除表的大多数,最好创建一个新表,复制所需的行,然后重命名。不幸的是,在步骤中任何添加/修改的行都不会反映在复制的表中。 (加上:你可能已经有了新的索引。)
在this中,我提供了多种方法来进行大删除。
什么是可能挂起你的系统:
在回滚的情况下,一个大DELETE
会隐藏所有旧值 - 这会导致调用DELETE
!让它完成可能会更快。
ALTER TABLE .. ADD INDEX
- 如果您使用的是MySQL 5.5或更早版本,则必须复制整个表格。即使您使用的是较新的版本(可以ALGORITHM=INPLACE
),仍然存在元数据锁定。 wp_options多久接触一次? (听起来好像太多次了。)
结论:如果您从尝试中恢复,但删除仍有待完成,请在我的链接中选择最佳方法。之后,将索引添加到仅20K行应该需要一些时间,但这不是一个致命的长时间。并考虑升级到5.6或更高版本。
如果您需要进一步讨论,请提供SHOW CREATE TABLE wp_options
。
但是等等!如果autoload
是一个简单的是/否标记',则可能不会使用该索引。也就是说,添加索引可能是浪费! (对于低基数,执行表扫描比更快而不是在索引BTree和数据BTree之间来回跳转。)请提供该帖子的链接;我想吐他们。