[질문] mysql 레코드 수가 1000 만개 정도일때...

hurryon의 이미지

안녕하세요. mysql 의 레코드 수가 약 1000만개 정도가 된다면
안정성이라고 해야 하나? 아니면 검색 능력과 같은것이 어떨지요?

테이블 구조는 다음과 같습니다.

mysql> desc iif;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | bigint(20)  |      | PRI | NULL    | auto_increment |
| keyword | varchar(18) |      |     |         |                |
| did     | int(11)     | YES  |     | NULL    |                |
| weight  | float       | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.03 sec)

물론 다른 몇개의 테이블도 더 있습니다만...아마도 위의 iif 테이블의
레코드 수가 가장 많을거 같습니다. 안정성은 어떨지?

C API로 접근하고 있습니다.

cannes의 이미지

MySQL에 1000만건의 레코드를 한 테이블에 저장을 해보지는 않았지만
일반적인 경험으로 보면 테이블을 나누시는게 좋은 방법 같습니다.

예를들어 등록되는 레코드의 월별로 나눈다던지 아니면 Primary Key를
몇개의 그룹으로 나누어서 테이블을 별도로 가지고 가는거죠..

1000만건을 한 테이블에 저장한다면 물론 PK로 잡혀있는 필드에 대한
검색은 어느정도 속도가 나오겠지만 그 외의 필드는 검색을 할때
속도를 전혀 보장할수 없습니다.

더군다나 key 외의 조건으로 update나 delete가 발생을 한다면
하나의 Query가 하나의 트랜잭션이기 때문에 너무 많은 레코드가
하나의 트랙잭션에 대한 결과로 발생을 하면서 최악의 경우에
트랜잭션 로그가 깨지면서 DB가 recovery 되지 않는 경우도
발생 가능합니다.

물론 code table처럼 조회만 하는 테이블이라면 이러한 문제는
없겠지만 1000만건의 데이터를 하나의 테이블로 가지고 가는것은
잠재적으로 문제를 발생할 소지가 많으므로 가능하면 테이블을 나누는
방향으로 설계를 하시길..

저의 개인적인 의견이었습니다.. ^^

partout의 이미지

Quote:
MySQL에 1000만건의 레코드를 한 테이블에 저장을 해보지는 않았지만
일반적인 경험으로 보면 테이블을 나누시는게 좋은 방법 같습니다.

예를들어 등록되는 레코드의 월별로 나눈다던지 아니면 Primary Key를
몇개의 그룹으로 나누어서 테이블을 별도로 가지고 가는거죠..

좀 더 구체적인 예를 들어서 설명해 주시면 안 될까요?
저도 관심이 많은 주제라... 좀 더 자세하게 듣고 싶습니다.

답변 부탁드립니다.

어찌나 졸린지..~~

beta의 이미지

주로 어떤 query 를 이용하여 검색하는지에 따라 설계가 많이 좌우 되겠지만,
주로 아이디를 이용해서 어떤값을 가져온다고 할때,

숫자로 시작하는 아이디만 table iif_n
a    로 시작하는 아이디만 table iif_a
......
a    로 시작하는 아이디만 table iif_z

와 같이 구성해서 필요할 테이블만 query 하는 겁니다.
물론 query 에 따라 테이블 구성은 판이하게 틀리겠지만요.

아마도 cannes 님은 이렇게 테이블 row 를 줄여서 scanning 시간을 줄이라고 말씀하시는거 같습니다.

partout wrote:
Quote:
MySQL에 1000만건의 레코드를 한 테이블에 저장을 해보지는 않았지만
일반적인 경험으로 보면 테이블을 나누시는게 좋은 방법 같습니다.

예를들어 등록되는 레코드의 월별로 나눈다던지 아니면 Primary Key를
몇개의 그룹으로 나누어서 테이블을 별도로 가지고 가는거죠..

좀 더 구체적인 예를 들어서 설명해 주시면 안 될까요?
저도 관심이 많은 주제라... 좀 더 자세하게 듣고 싶습니다.

답변 부탁드립니다.

발 담갔다. 이제 익숙해 지는길만이..

소타의 이미지

1천만건 정도의 데이터이고 mysql이라면 id 를 unsigned int 로 하셔도 될거 같습니다.
일단 이 테이블에서 인덱스는 id 컬럼에만 걸려 있는거 같으니 id 로 표시할수 있는 최대 범위를 추측해야 할 거 같습니다.
1천만건 정도라면 unsigned int 로도 충분히!! 표현 할 수 있으며 이렇게 바꾸게 되면 테이블의 크기는 약 10% 정도 줄어드나 인덱스의 크기는 절반으로 줄어 드는 이점이 있습니다. 혹시 다른 컬럼들도 쓸데없이 크게 잡힌건 아닌지 확인 해 보시구요..
인덱스가 절반으로 된다는 것은 mysql의 BTREE 인덱스의 효율이 2배가 된다는 것은 아니지만 분명한 향상이 있습니다.

간단하게 그 한 테이블만 놓고 계산해 보자면
4 (int) * 1천만 하면 4천만 바이트 입니다. 약 40메가 정도의 인덱스가 생성이 되고 이는 효율이나 속도를 크게 걱정 할 정도의 크기는 아닙니다.
단.. 검색은 항상 id 컬럼에서만 일어나야 하겠죠..

select 와 id 컬럼을 제외한 update 만 빈번하다면 크게 걱정 할 부분은 없을 거 같습니다.

안정성은......
mysql 이잖습니까? -_-;;;;;;;;

maximus의 이미지

위에서 Primary 키로 잡고 select 한다면 빠른속도로 수행이 가능합니다..
Primary 키가 char 형이면 상당히 복잡해 지겠지만요..

구조상 별로 큰 문제는 없다고 보여 집니다..

그리고 update 와 write 시 문제점은 InnoDB가 기본으로 배포는 요즘 Mysql 에서는 별 상관이 업습니다..
(사실 Insert 와 Delete가 조금 문제지요..)
low level locking 지원되기 떄문입니다.

그래서 DB가 크면 클수록 InnoDB로 가시는게 좋습니다..

=================================
:: how about a cup of tea ? ::
=================================

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.