【发布时间】:2014-09-04 18:05:27
【问题描述】:
假设我们有一个带有 MySQL 5.6 数据库的网络论坛应用程序,许多用户可以 24/7 全天候访问。现在有一个这样的表格,用于发送给用户的通知元数据。
| notifications | CREATE TABLE `notifications` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned NOT NULL,
`message_store_id` bigint(20) unsigned NOT NULL,
`status` varchar(10) COLLATE ascii_bin NOT NULL,
`sent_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`,`sent_date`)
) ENGINE=InnoDB AUTO_INCREMENT=736601 DEFAULT CHARSET=ascii COLLATE=ascii_bin |
此表有 100 万行。使用此表,某个 message_store_id 由于某种原因突然变得无效,我计划使用单个删除语句删除所有具有该 message_store_id 的记录,例如
DELETE FROM notifications WHERE message_store_id = 12345;
这条语句影响了 10% 的表,因为这条消息被发送给了这么多用户。同时,成千上万的用户一直在访问此通知表,因此必须存在索引。显然,在删除记录时重新创建索引非常昂贵,所以我害怕这样做并通过最大化服务器资源而导致停机时间。但是,如果我删除索引,删除记录然后重新添加索引,我必须关闭数据库一段时间,很遗憾我们的服务无法使用。
我希望 MySQL 5.6 不会那么愚蠢,以至于这一条语句可以杀死数据库,但我想这很有可能。我的问题是,对于这样的案例,索引重新创建真的是致命的吗?如果是这样,这个操作有什么好的策略不需要我停止数据库进行维护吗?
【问题讨论】:
-
你有
message_store_id的索引吗?
标签: php mysql sql database indexing