데이터베이스에서 너무 많은 행이 몇 개 있습니까?


87

1,000,000 개의 레코드가있는 MySQL InnoDB 테이블이 있습니다. 너무 많나요? 아니면 데이터베이스가이 이상을 처리 할 수 ​​있습니까? 일부 쿼리 (예 : 테이블에서 마지막 행 가져 오기)가 100 개 행보다 100 만 행이있는 테이블에서 더 느리다는 것을 알았 기 때문에 묻습니다.

답변:


114

1000000 레지스터가있는 MySQL InnoDB 테이블이 있습니다. 너무 많나요?

아니요, 1,000,000 개의 행 (AKA 레코드)은 데이터베이스에 비해 너무 많지 않습니다.

일부 쿼리 (예 : 테이블의 마지막 레지스터 가져 오기)가 100 만 개의 레지스터가있는 테이블보다 100 만 개의 레지스터가있는 테이블에서 더 느리다는 것을 알았 기 때문에 묻습니다.

그 진술에서 설명 할 것이 많다. 일반적인 용의자는 다음과 같습니다.

  1. 잘못 작성된 쿼리
  2. 기본 키를 사용하지 않고 테이블에 존재한다고 가정합니다.
  3. 잘못 설계된 데이터 모델 (테이블 구조)
  4. 인덱스 부족

4
5. 오래된 서버 사양 <마지막 수단.
Sneakyness 2009

19
@Brimstedt : 또한 항상 명사가 "인덱스"여야한다고 생각했지만, 데이터베이스에 사용하는 사람을 본 적이 없다고 생각합니다. Wikipedia : en.wikipedia.org/w/… 에서 Mr. Coding Horror : codinghorror까지. COM / 블로그 / 아카이브 / 000638.html . 주제에 대한 흥미로운 SO 게시물이 있습니다 : stackoverflow.com/questions/1001366 .
Daniel Vassallo

7
6. innodb의 다양한 캐시에 할당 된 메모리 부족
Jason

성능 향상을 위해 PrimaryKey를 사용해야하나요? Index, Unique와 같은 다른 키를 사용하는 것은 어떻습니까? 이것들을 사용해도 될까요? 감사
user1844933

제이슨은 말했다와 같이 아마 컴퓨터가 메모리와 hogged하는 프로세스의 중간에 차단한다
ytpillai

67

97,000,000 개 이상의 레코드 ( 30GB 데이터 파일 ) 가있는 데이터베이스가 있으며 문제가 없습니다.

테이블 인덱스 를 정의하고 개선하는 것을 잊지 마십시오 .

따라서 1,000,000 은 많지 않다는 것이 분명합니다 ! (하지만 색인을 생성하지 않으면 예, 많음)


10
자동 증분을 선택하여 열에 "기본 키"를 추가하는 것이 인덱싱됩니까?
Nathan

8
@Nathan, 실제로 열을 기본 키로 할당하면 자동으로 인덱싱되지만 일부 열에 대한 인덱스를 추가해야하는 경우 쿼리를 최적화하려면이 stackoverflow.com/을
dav

1 조 개의 테이블이 있지만 IN LIFO 형식 데이터를 선택하는 것이 느립니다.
Saurabh 찬드라 파텔

문제가 없음을 정의하십시오. 가장 복잡한 쿼리는 얼마나 걸리나요? 1 억 개의 행이있는 테이블이 있고 클라이언트는 사용하는 그룹화 또는 순서 지정 기준에 관계없이 최대 5 초 이내에 쿼리가 수행 될 것으로 예상합니다. 우리의 인덱스를 개선하지만 우리는 모든 인덱스 추가하려고 잠금 전에 수
조 Yahchouchi

생산 테이블의 20 % (이전 연구에 따르면)에는 100 만 개 이상의 행이 있습니다. 수십억 개의 행이 있는 몇 개를 보았습니다 .
Rick James

19

'설명'을 사용하여 쿼리를 검토하고 쿼리 계획에 문제가 있는지 확인하십시오.


6
이것은 좋은 생각이지만이 답변 자체는 초보자에게 좋지 않습니다. EXPLAIN의 출력은 그다지 직관적이지 않습니다 ...
nickf

17
쿼리를 검토하는 데 도움이되는 다른 도구가 없으므로 EXPLAIN초보자이든 아니든 학습을 시작하는 것이 좋습니다 .
nos

30
누군가가 설명 할 수 있다면 좋을 것입니다 EXPLAIN;)
Jo E.


15

저는 이것이 일반적인 오해라고 생각합니다. 데이터베이스 확장 성과 관련하여 크기는 방정식의 일부일뿐입니다. 어렵거나 더 어려운 다른 문제가 있습니다.

  • 작업 세트의 크기 (즉, 메모리에로드되고 적극적으로 작업해야하는 데이터의 양). 데이터를 삽입하고 아무것도하지 않으면 실제로 해결하기 쉬운 문제입니다.

  • 어떤 수준의 동시성이 필요합니까? 삽입 / 읽는 사용자가 한 명뿐입니까? 아니면 한 번에 수천 개의 클라이언트가 작동합니까?

  • 어떤 수준의 약속 / 내구성 및 성능 일관성이 필요합니까? 우리가 각 커밋을 존중할 수 있는지 확인해야합니까? 평균 트랜잭션이 빠르면 괜찮습니까, 아니면 모든 트랜잭션이 안정적으로 빠른지 확인하고 싶습니까 ( http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- and-six-sigma / ).

  • 테이블 스키마 ALTER와 같은 운영 문제를 수행해야합니까? InnoDB에서는 가능하지만 포 그라운드에서 임시 테이블을 만들어야하는 경우가 많기 때문에 (모든 연결을 차단) 놀라 울 정도로 느립니다.

그래서 저는 두 가지 제한적인 문제를 다음과 같이 말할 것입니다.

  • 쿼리 작성 / 좋은 색인 보유에 대한 자신의 기술.
  • ALTER TABLE 문을 기다리는 동안 얼마나 많은 고통을 견딜 수 있는지.

2
편집 : 임시 테이블을 만드는 ALTER TABLE에 대한 조언은 약간 날짜가 있습니다. MySQL 5.5에는 빠른 인덱스 생성 기능이 있으며 5.6에는 이제 온라인 DDL이 있습니다.
Morgan Tocker 2014 년

3

백만 행을 의미하는 경우 인덱싱이 수행되는 방법과 하드웨어 구성에 따라 다릅니다. 백만 개의 행은 엔터프라이즈 데이터베이스 또는 괜찮은 장비의 개발 데이터베이스에 큰 양이 아닙니다.

백만 개의 열을 의미하는 경우 (MySQL에서도 가능하지 않음) 예, 이것은 약간 큰 것으로 보이며 아마도 문제를 일으킬 것입니다.


3

레지스터? 기록을 의미합니까?

요즘 데이터베이스에서 백만 개의 레코드는 큰 문제가 아닙니다. 문제가 발생하는 경우 데이터베이스 시스템 자체가 아니라 실행중인 하드웨어 일 가능성이 높습니다. 하드웨어가 부족해지기 전에 DB에 문제가 발생하지 않을 것입니다.

이제 분명히 일부 쿼리는 다른 쿼리보다 느리지 만 매우 유사한 쿼리 두 개가 매우 다른 시간에 실행되는 경우 데이터베이스의 실행 계획이 무엇인지 파악하고이를 최적화해야합니다. 즉, 올바른 인덱스, 적절한 정규화 등을 사용해야합니다.

덧붙여서 테이블에 "마지막"레코드와 같은 것은 없으며 논리적 관점에서 볼 때 고유 한 순서가 없습니다.


I "아이디 DESC의 LIMIT 0 BY 테이블 ORDER SELECT * FROM"와 같은 의미 일
Juanjo 콘티

4
SELECT LAST_INSERT_ID()해당 쿼리 대신 필요할 수 있습니다.
True Soft

3

분석 작업을 위해 자체 조인 된 수십억 (인덱싱 된) 레코드가있는 분할되지 않은 테이블을 보았습니다. 우리는 결국 일을 분할했지만 솔직히 그다지 큰 차이를 보지 못했습니다.

즉, 그것은 Oracle에 있었고 MySQL에서 그 양의 데이터를 테스트하지 않았습니다. 색인은 당신의 친구입니다 :)


2

"등록"으로 "레코드"를 의미한다고 가정하면, 너무 많지는 않습니다. MySQL은 정말 잘 확장되고 하드 디스크에 필요한만큼의 레코드를 보유 할 수 있습니다.

분명히 검색 쿼리가 느려질 것입니다. 필드가 적절하게 인덱싱되었는지 확인하는 것 외에는 그 문제를 해결할 방법이 없습니다.


2
기술적으로 테이블의 크기는 사용중인 파일 시스템의 최대 파일 크기에 의해 제한 될 수도 있습니다.
tster 2009

0

테이블이 더 커질수록 (더 많은 행에서와 같이) 인덱스가없는 경우 일반적으로 더 느린 쿼리가 실행됩니다. 올바른 인덱스를 추가하면 쿼리 성능이 향상되거나 적어도 테이블이 커짐에 따라 저하되지 않아야합니다. 그러나 테이블이 커짐에 따라 쿼리 자체가 더 많은 행을 반환하면 성능 저하가 다시 나타납니다.

1M 행은 그다지 많지 않지만 DB 서버에있는 메모리 양에 따라 다릅니다. 테이블이 너무 커서 서버가 메모리에 캐시 할 수 없으면 쿼리 속도가 느려집니다.


0

제공된 쿼리를 사용하면 정렬 병합 방법을 사용하여 데이터를 정렬하기 때문에 매우 느립니다.

색인을 사용하여 검색하거나 이미 그런 방식으로 정렬되어 있으므로 정렬이 필요하지 않도록 디자인을 다시 생각하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.