我在 CentOS 7 上运行 MySQL 服务器 v5.7.18。
其中一张表用作 Web API 的操作日志,并且已增长到 2000 万行。
用户从运行如下查询的前端应用程序搜索此表:
SELECT * FROM log_table WHERE some_long_id = '12345abdcef';
该some_long_id
列是文本类型,并且包含 UUID 样式的字母数字 ID。
目前,此查询大约需要 20 秒才能完成。
我发现如果我在此列上添加一个键,查询几乎会立即运行:
ALTER TABLE log_table ADD KEY (some_long_id(64));
此操作需要很长时间,但可以完成工作。
我在离线虚拟数据库上对其进行了测试。
我的问题:
我可以在ADD KEY
不关闭 Web 应用程序的情况下安全地在生产数据库上运行操作吗?
有一个 API 可以不断地将新行插入到这个表中,可能每秒几次。
这会影响索引吗?它会破坏什么吗?索引表时插入会失败吗?
编辑:忘了提到它正在使用 innoDB 引擎。
PS我不是DBA,我只需要管理这个东西,所以我的整个方法可能是错误的。
也欢迎“改为这样做”的答案。
此外,谷歌搜索没有给出关于这个问题的相关结果,如果它是重复的,对不起。
IIRC mysql 已经支持在线二级索引创建一段时间了,假设您使用的是像 InnoDB 这样的表类型:https ://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html “在创建索引时,该表仍可用于读写操作”。
您的应用程序可能会看到一些交互性能下降,而像 IO 这样的大型操作会导致您的应用程序的交互性能下降,但您不应该完全失去它。
对于您自己的想法,为了确保没有任何阻塞或减慢速度超过您的用户接受的程度,也许在您重复之前的测试时尝试针对副本数据库运行应用程序实例。