데이터베이스에서 너무 많은 행이 몇 개 있습니까?
1,000,000 개의 레코드가있는 MySQL InnoDB 테이블이 있습니다. 너무 많나요? 아니면 데이터베이스가이 이상을 처리 할 수 있습니까? 일부 쿼리 (예 : 테이블에서 마지막 행 가져 오기)가 100 개 행보다 100 만 행이있는 테이블에서 더 느리다는 것을 알았 기 때문에 묻습니다.
1000000 레지스터가있는 MySQL InnoDB 테이블이 있습니다. 너무 많나요?
아니요, 1,000,000 개의 행 (AKA 레코드)은 데이터베이스에 비해 너무 많지 않습니다.
일부 쿼리 (예 : 테이블의 마지막 레지스터 가져 오기)가 100 만 레지스터가있는 테이블보다 100 만 레지스터가있는 테이블에서 더 느리다는 것을 알았 기 때문에 묻습니다.
그 진술에서 설명 할 것이 많다. 일반적인 용의자는 다음과 같습니다.
- 잘못 작성된 쿼리
- 기본 키를 사용하지 않고 테이블에 존재한다고 가정합니다.
- 잘못 설계된 데이터 모델 (테이블 구조)
- 인덱스 부족
97,000,000 개 이상의 레코드 ( 30GB 데이터 파일 ) 가있는 데이터베이스가 있으며 문제가 없습니다.
테이블 인덱스 를 정의하고 개선하는 것을 잊지 마십시오 .
따라서 1,000,000 은 많지 않다는 것이 분명합니다 ! (하지만 색인을 생성하지 않으면 예, 많음)
'설명'을 사용하여 쿼리를 검토하고 쿼리 계획에 문제가 있는지 확인하십시오.
저는 이것이 일반적인 오해라고 생각합니다. 데이터베이스 확장 성과 관련하여 크기는 방정식의 일부일뿐입니다. 어렵거나 더 어려운 다른 문제가 있습니다.
작업 세트의 크기 (즉, 메모리에로드되고 적극적으로 작업해야하는 데이터의 양). 데이터를 삽입하고 아무것도하지 않으면 실제로 해결하기 쉬운 문제입니다.
어떤 수준의 동시성이 필요합니까? 삽입 / 읽는 사용자가 한 명뿐입니까? 아니면 한 번에 수천 개의 클라이언트를 운영하고 있습니까?
어떤 수준의 약속 / 내구성 및 성능 일관성이 필요합니까? 우리가 각 커밋을 존중할 수 있는지 확인해야합니까? 평균 트랜잭션이 빠르면 괜찮습니까, 아니면 모든 트랜잭션이 안정적으로 빠른지 확인하고 싶습니까 ( http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- 와 같은 6 시그마 품질 관리) and-six-sigma / ).
테이블 스키마 ALTER와 같은 운영 문제를 수행해야합니까? InnoDB에서 이것은 가능하지만, 종종 포 그라운드에서 임시 테이블을 만들어야하므로 (모든 연결을 차단) 매우 느립니다.
그래서 저는 두 가지 제한적인 문제를 다음과 같이 말할 것입니다.
- 쿼리 작성 / 좋은 색인 보유에 대한 자신의 기술.
- ALTER TABLE 문을 기다리는 동안 얼마나 많은 고통을 견딜 수 있는지.
백만 개의 행을 의미하는 경우 인덱싱이 수행되는 방식과 하드웨어 구성에 따라 다릅니다. 백만 개의 행은 엔터프라이즈 데이터베이스 또는 괜찮은 장비의 개발 데이터베이스에 큰 양이 아닙니다.
백만 개의 열을 의미하는 경우 (MySQL에서도 가능하지 않음) 예, 이것은 약간 큰 것으로 보이며 아마도 문제를 일으킬 것입니다.
레지스터? 기록을 의미합니까?
요즘 데이터베이스에서 백만 개의 레코드는 큰 문제가 아닙니다. 문제가 발생하는 경우 데이터베이스 시스템 자체가 아니라 실행중인 하드웨어 일 가능성이 높습니다. 하드웨어가 부족해지기 전에 DB에 문제가 발생하지 않을 것입니다.
이제 분명히 일부 쿼리는 다른 쿼리보다 느리지 만 매우 유사한 두 쿼리가 매우 다른 시간에 실행되는 경우 데이터베이스의 실행 계획이 무엇인지 파악하고이를 최적화해야합니다. 즉, 올바른 인덱스, 적절한 정규화 등을 사용해야합니다.
덧붙여 말하면, 테이블에 "마지막"레코드와 같은 것은 없으며 논리적 관점에서 볼 때 고유 한 순서가 없습니다.
분석 작업을 위해 자체 조인 된 수십억 (인덱싱 된) 레코드가있는 분할되지 않은 테이블을 보았습니다. 결국 우리는 그 일을 분할했지만 솔직히 그다지 큰 차이를 보지 못했습니다.
즉, 그것은 Oracle에 있었고 MySQL에서 그 양의 데이터를 테스트하지 않았습니다. 색인은 당신의 친구입니다 :)
"등록"으로 "레코드"를 의미한다고 가정하면, 너무 많지는 않습니다. MySQL은 정말 잘 확장되고 하드 디스크에 필요한만큼의 레코드를 보유 할 수 있습니다.
분명히 검색 쿼리가 느려질 것입니다. 필드가 적절하게 인덱싱되었는지 확인하는 것 외에는 실제로 방법이 없습니다.
테이블이 더 커질수록 (더 많은 행에서와 같이) 인덱스가없는 경우 일반적으로 더 느린 쿼리가 실행됩니다. 올바른 인덱스를 추가하면 쿼리 성능이 향상되거나 적어도 테이블이 커지는만큼 저하되지 않아야합니다. 그러나 테이블이 커짐에 따라 쿼리 자체가 더 많은 행을 반환하면 성능 저하가 다시 나타납니다.
1M 행은 그다지 많지 않지만 DB 서버에있는 메모리 양에 따라 다릅니다. 테이블이 너무 커서 서버가 메모리에 캐시 할 수 없으면 쿼리 속도가 느려집니다.
제공된 쿼리를 사용하면 정렬 병합 방법을 사용하여 데이터를 정렬하기 때문에 매우 느립니다.
인덱스를 사용하여 검색하거나 정렬이 필요하지 않도록 이미 그런 방식으로 정렬되었는지 확인하도록 디자인을 다시 생각하는 것이 좋습니다.
참고 URL : https://stackoverflow.com/questions/1926079/how-many-rows-in-a-database-are-too-many
'Development Tip' 카테고리의 다른 글
Vuejs : 경로 변경 이벤트 (0) | 2020.10.06 |
---|---|
모든 개발자는 법적 문제에 대해 무엇을 알아야합니까? (0) | 2020.10.06 |
Django의 ./manage.py syncdb를 실행할 때 자동으로 관리자 사용자 생성 (0) | 2020.10.06 |
Event.target이 Typescript의 요소가 아닌 이유는 무엇입니까? (0) | 2020.10.05 |
Javascript "Uncaught TypeError : object is not a function"연관성 질문 (0) | 2020.10.05 |