많은 많은 사용자가 24 시간 액세스 할 수있는 MySQL 5.6 데이터베이스가있는 웹 포럼 응용 프로그램이 있다고합시다. 이제 사용자에게 전송되는 알림의 메타 데이터에 대해 이와 같은 표가 있습니다.인덱스가 큰 MySQL 테이블에서 성능이 저하되었습니다
| 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은 어떤 이유로 갑자기 효과가되어 나는이 하나의 문이 있기 때문에 테이블의 10 %에 영향을 미치는
DELETE FROM notifications WHERE message_store_id = 12345;
같은 단일 삭제 문이 message_store_id으로 모든 레코드를 제거 할 계획입니다 많은 사용자에게 메시지가 전송되었습니다. 이 알림 테이블은 수천 명의 사용자가 항상 액세스하므로 인덱스가 있어야합니다. 분명히 인덱스 레크 리 에이션은 레코드를 삭제할 때 매우 비용이 많이 드는 것이므로 서버 리소스를 최대한 활용하여 시간을 절약 할 수 있습니다. 그러나 인덱스를 삭제하고 레코드를 삭제 한 다음 인덱스를 다시 추가하면 언젠가 데이터베이스를 종료해야하지만 불행히도 서비스가 불가능합니다.
나는이 5.6이 데이터베이스를 죽일 수있는 바보가 아니기를 바랄 뿐이지 만 가능성은 매우 높다고 생각한다. 제 질문은이 경우에 대비해 인덱스 재현이 정말로 치명적입니까? 그렇다면 유지 관리를 위해 데이터베이스를 중지 할 필요가없는이 작업을위한 좋은 전략이 있습니까?
'message_store_id'에 색인이 있습니까? – cmorrissey