대량의 (4 백만 행) mysql 데이터를 매우 정기적으로 효율적으로 삭제


10

주어진 시간에 약 1,200 만 개의 행이있는 mysql 테이블이 있습니다. 테이블 크기를 어느 정도 관리 할 수있게하려면 오래된 데이터를 삭제해야합니다.

현재 cron 작업을 사용하여 매일 자정에이 쿼리를 실행하고 있습니다.

DELETE FROM table WHERE endTime < '1393632001'

쿼리를 마지막으로 실행했을 때 4,602,400을 검사하고 3 분 이상이 걸리고 CPU가 지붕을 통과했습니다.

자정에 CPU 스파이 킹

오래된 데이터를 지우면서 CPU, 동기식 DB 연결, 디스크 큐 깊이 등이 부적절하게 급증하지 않도록하려면 어떻게해야합니까?

추신 : 사용주기에서 쿼리가 실제로 부적절한 시간에 진행되고 있음을 알 수 있습니다. 쿼리 타이밍이 매일 가장 낮은 사용 지점에서 발생하도록 이동했다고 가정합니다. 또한 "endTime"에 대한 색인이 없으며 가능한 한 많은 양의 데이터가 정기적으로 삽입되고 조회가 많지 않기 때문에 가능한 한 그렇게 유지하는 것이 좋습니다.

php  mysql 

cron 작업을 사용하여 매 10 분마다 100k 또는 매 5 분마다 5k마다 삭제

더 정기적으로 작은 덩어리?

좋아, 그러나 그것은 우리의 사용자 경험을 더 오랜 시간 동안 손상시킬 수있는 것처럼 보입니다 :) 우리가 현명하게 쿼리 / 디자인 할 수있는 일이 있습니까?

1
186k 명의 사용자, 전용 DB 담당자가 없습니까?

1
"데이터베이스 관리자"에 대한보다 나은 답변을 얻을 수 있습니다
James Anderson

답변:


13

문제에 대한 해결책은 "파티셔닝"이라는 MySQL 기능입니다. 설명서는 여기에 있습니다 .

파티셔닝은 단일 테이블을 별도의 "파티션"에 저장하는 것입니다. 이들은 특정 표현식 (일반적으로 열 값 또는 범위)으로 정의됩니다. 귀하의 경우, 이것은 아마도 endTime레코드가 생성 될 때 알려져 있고 변경되지 않는다고 가정 할 때 아마도 기반 일 것입니다 .

endTime각 파티션에 하루의 가치를 저장 합니다. 그런 다음 삭제 단계는 큰 테이블에서 많은 행을 삭제하지 않고 파티션을 자릅니다. 파티션 잘림은 훨씬 빠른 방법입니다.


와우, 그것은 매우 도움이되었고 완벽한 솔루션처럼 보입니다. 파티셔닝을 읽을 시간입니다! 감사!

파티셔닝은 오버 헤드에주의하는 좋은 솔루션 일 수 있지만 쿼리 속도가 크게 느려질 수 있습니다. 또한 잘라 내기 테이블은 즉각적이지 않습니다. pt-archiver을 고려할 것입니다. 당신은 스파이크 문제를 해결하고 지금처럼 간단하게 테이블을 유지할 수 있습니다
akuzminsky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.