mysql 에서 데이터를 빠르게 삭제 할 방법

망치의 이미지

지속적으로 유발하는 데이터를 mysql 에 저장하고, 약 한시간 또는 하루가 지난 데이터의 경우는 삭제하려고 하는데, 워낙에 많은 데이터가 쌓이다 보니 삭제하는데도 시간이 오래 걸리고 그 시간동안 db 접근을 못해서 문제가 되고 있습니다.

원하는 기간이 지난 데이터는 자동 파기 되도록 하거나 아니면 좀 더 빨리 삭제 할 방법이 있을까요?
truncate 처럼 가볍게 지울 수 있는 방법이 있다면 좋은데 이녀석은 테이블 전체를 비우는거라 적용이 힘들구요..

codebank의 이미지

Google을 이용해서 찾아보니 거의 비슷한 방법을 제시하는군요.
http://community.livejournal.com/mysql/104915.html
거의 cron을 이용해서 지우라고 권장하기는 하는데 그렇다고 많은 데이터를
한꺼번에 지우는데는 별로 도움이 안되는 것 같아서 MySQL을 참고하니...
http://dev.mysql.com/doc/refman/5.0/en/delete.html
DELETE QUICK 이라는 것을 사용하면 빨라진다고 하네요.
QUICK을 이용해서 지우는 것보다는 빠르기는한데...
정확한 해석이 아니라서 우려스러운건 WHERE절에 걸치는 부분이 인덱스 즉,
일종의 key형태로 이루어져야한다고 하는 것 같기도 합니다.
뭐라고 써있기는한데 제가 번역에 어려움을 겪고있어서... :-)
한번 읽어보시면 무언가 힌트를 얻을 수 있지 않을까 생각되네요.
------------------------------
좋은 하루 되세요.

------------------------------
좋은 하루 되세요.

망치의 이미지

답변 감사드립니다.

기존에도 cron 을 이용하고 있었는데.. 데이터 삭제후에 optimize table 까지 돌아가면 꽤 긴 시간동안 작업을 하더군요.. 붐비지 않는 시간대에 돌리긴 하지만 아무래도 시간이 좀 걸리다보니 그사이에 연결 실패하는 경우가 많아서요..

알려주신 delete quick 의 정확한 사용법을 몰라서.. 일단 기존 쿼리를 단순히 delete 에서 delete quick 으로 바꾸어 봤는데 아주 약간 나아진듯한 모습을 보여줍니다. 약 3만 라인을 삭제하는데 delete 가 18초, delete quick 가 16초 정도 소요되더군요.

기존 쿼리 형식은

delte from table where 등록시각 < 유효시각 limit (레코드 수)

이고 시간은 INT unsigned 형식으로 저장되어있고 인덱스 설정을 해두었습니다.

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

keizie의 이미지

완전히 연속된 자료라면 안 맞을 수도 있겠지만, 가령 하루로 나뉘는 묶음이라면 아예 테이블 이름에 날짜를 붙여서 따로 만들고 날짜가 지나면 그 테이블만 날리는 것도 괜찮지 않을까 합니다.

codebank의 이미지

저도 이방법을 생각해 봤는데 질문올리신분이 truncate를 사용할 수 없다는 말을
하셔서 언급을 안했었네요.

제가 볼때는 연속적인 데이터가 아닐까 생각됩니다.

그나저나 하루동안 얼마나 많은 데이터가 쌓이길래 삭제할때 접근조차 못한다는 것인지
그 용량이 궁금하네요. :-)
------------------------------
좋은 하루 되세요.

------------------------------
좋은 하루 되세요.

망치의 이미지

연속된 데이터가 맞습니다. :)

사실 그렇게 많은 데이터가 쌓이는것도 아닙니다. 다만 delete, optimize 작업을 처리 하는동안 해당 테이블 접근이 지연되다보니 이 부분을 해결 할 수 없을까 싶던 생각에 조금 과장되게 표현했던것같습니다. ^^;

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

dormael의 이미지

optimize는 그렇다 쳐도 delete시에 지연이 심하다고 하셔서..
TABLE LOCK이 걸리는게 아닌가 해서요..

아닐 경우에 지연을 줄이는 방법은 처리(삭제) 시간을 늘리는 방법이 있습니다.

예를들어 조건에 해당하는 것들을 몇(?)개씩 SELECT 해온후에 하나씩 삭제를 하되 순간적인 로드(혹은 LOCK)를 줄이기 위해 중간중간 쉬어주는 방법으로요.

삭제 배치를 자주 돌리고 삭제에 해당하는 조건을 작게 주는것도 방법일 수 있겠네요.

optimize도 좋긴 하겠지만 row가 많을경우 보통은 서비스 중에는 잘 안쓰는 걸로 알고 있습니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

송효진의 이미지

윗분말대로 MyISAM 보다는 InnoDB 를 권장합니다.
auto_increment 속성을 안줄 수 있다면 heap 도 좋습니다.
어차피 지워지는 내용 메모리에만 보관하면 편하죠.
my.cnf 에서 heap 의 크기를 늘려줄 수 있습니다.

emerge money

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.