성능이 저하되기 전에 MySQL 데이터베이스가 얼마나 커질 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1276

문제

MySQL 데이터베이스의 성능이 저하되기 시작하는 시점은 언제입니까?

  • 물리적 데이터베이스 크기가 중요합니까?
  • 레코드 수가 중요합니까?
  • 성능 저하가 선형적인가요, 아니면 기하급수적인가요?

나는 거의 2GB를 차지하는 대략 1,500만 개의 레코드를 포함하는 대규모 데이터베이스라고 생각하는 것을 가지고 있습니다.이러한 수치를 바탕으로 데이터를 정리해야 할 인센티브가 있습니까? 아니면 몇 년 동안 계속 확장해도 안전합니까?

도움이 되었습니까?

해결책

실제 데이터베이스 크기는 중요하지 않습니다.레코드 수는 중요하지 않습니다.

내 경험상 직면하게 될 가장 큰 문제는 크기가 아니라 한 번에 처리할 수 있는 쿼리 수입니다.읽기 쿼리가 슬레이브에 대해 실행되고 쓰기 쿼리가 마스터에 대해 실행될 수 있도록 마스터/슬레이브 구성으로 이동해야 할 가능성이 높습니다.그러나 아직 이에 대한 준비가 되지 않은 경우 실행 중인 쿼리에 대한 인덱스를 언제든지 조정하여 응답 시간을 단축할 수 있습니다.또한 Linux의 네트워크 스택과 커널에 대해 수행할 수 있는 많은 조정이 도움이 될 것입니다.

나는 적당한 수의 연결만으로 최대 10GB를 얻었고 요청을 잘 처리했습니다.

먼저 인덱스에 초점을 맞춘 다음 서버 관리자에게 OS를 살펴보도록 하고, 그래도 도움이 되지 않으면 마스터/슬레이브 구성을 구현해야 할 때입니다.

다른 팁

일반적으로 이는 매우 미묘한 문제이며 전혀 사소하지 않습니다.나는 당신이 읽기를 권장합니다 mysqlperformanceblog.com 그리고 고성능 MySQL.나는 이것에 대한 일반적인 대답이 없다고 생각합니다.

저는 거의 1TB의 데이터가 포함된 MySQL 데이터베이스가 있는 프로젝트를 진행하고 있습니다.가장 중요한 확장성 요소는 RAM입니다.테이블의 인덱스가 메모리에 적합하고 쿼리가 고도로 최적화된 경우 일반 시스템으로 합리적인 양의 요청을 처리할 수 있습니다.

테이블의 모양에 따라 레코드 수는 중요합니다.varchar 필드가 많거나 int 또는 long이 몇 개만 있는 것은 차이점입니다.

데이터베이스의 물리적 크기도 중요합니다.예를 들어 백업을 생각해 보세요.엔진에 따라 물리적 DB 파일이 커지지만 innodb와 같이 축소되지는 않습니다.따라서 많은 행을 삭제해도 실제 파일을 축소하는 데 도움이 되지 않습니다.

이 문제에는 많은 문제가 있으며 대부분의 경우 악마는 세부 사항에 있습니다.

데이터베이스 크기 중요하다.백만 개가 넘는 레코드가 있는 테이블이 두 개 이상 있으면 성능이 실제로 저하되기 시작합니다.물론 레코드 수는 성능에 영향을 미칩니다. 큰 테이블에서는 MySQL이 느려질 수 있습니다..백만 개의 레코드에 도달하면 인덱스가 올바르게 설정되지 않으면 성능 문제가 발생합니다(예: "WHERE 문" 또는 조인의 "ON 조건" 필드에 대한 인덱스가 없음).천만 개의 레코드에 도달하면 모든 인덱스가 올바르더라도 성능 문제가 발생하기 시작합니다.하드웨어 업그레이드(더 많은 메모리와 더 많은 프로세서 성능, 특히 메모리 추가)는 성능을 최소한 어느 정도 다시 높여 가장 심각한 문제를 줄이는 데 도움이 되는 경우가 많습니다.예를 들어 37개의 신호가 32GB RAM에서 128GB RAM으로 변경되었습니다. Basecamp 데이터베이스 서버용.

서버 관리자가 OS를 살펴보는 것보다 인덱스에 먼저 초점을 맞추고 모든 것이 도움이 되지 않으면 마스터/슬레이브 구성을 해야 할 때일 수 있습니다.

그것은 사실이다.일반적으로 효과가 있는 또 다른 방법은 반복적으로 작업하는 데이터의 양을 줄이는 것입니다."이전 데이터"와 "새 데이터"가 있고 쿼리의 99%가 새 데이터로 작동하는 경우 기존 데이터를 모두 다른 테이블로 옮기고 확인하지 마세요.

-> 한번 보세요 파티셔닝.

2GB 및 약 1500만 개의 레코드는 매우 작은 데이터베이스입니다. 펜티엄 III(!)에서 훨씬 더 큰 데이터베이스를 실행했지만 모든 것이 여전히 매우 빠르게 실행됩니다.속도가 느린 경우 이는 mysql 문제가 아닌 데이터베이스/응용 프로그램 설계 문제입니다.

"데이터베이스 성능"에 대해 이야기하는 것은 의미가 없습니다. 여기서는 "쿼리 성능"이 더 나은 용어입니다.대답은 다음과 같습니다.쿼리, 작동하는 데이터, 인덱스, 하드웨어 등에 따라 다릅니다.EXPLAIN 구문을 사용하면 스캔할 행 수와 사용할 인덱스에 대한 아이디어를 얻을 수 있습니다.

2GB는 실제로 "대형" 데이터베이스로 간주되지 않으며 중간 크기에 가깝습니다.

또한 복잡한 조인에 주의하세요.거래량 외에도 거래 복잡성이 큰 요인이 될 수 있습니다.

무거운 쿼리를 리팩토링하면 성능이 크게 향상되는 경우가 있습니다.

나는 한때 "작동이 멈춘" mysql을 살펴보라는 요청을 받았습니다.DB 파일이 NFS2로 마운트되고 최대 파일 크기가 2GB인 Network Appliance 파일러에 있다는 것을 발견했습니다.그리고 당연히 트랜잭션 수락을 중지한 테이블의 디스크 공간은 정확히 2GB였습니다.하지만 성능 곡선에 관해서는 전혀 작동하지 않을 때까지 챔피언처럼 작동했다고 들었습니다!이 경험은 항상 당신이 자연스럽게 의심하는 것보다 위와 아래에 차원이 있다는 것을 나에게 상기시켜 주는 좋은 역할을 합니다.

고려해야 할 점은 시스템의 목적과 일상적인 데이터입니다.

예를 들어, 자동차를 GPS로 모니터링하는 시스템의 경우 이전 달의 자동차 위치에 대한 쿼리 데이터는 관련이 없습니다.

따라서 가능한 상담을 위해 데이터를 다른 기록 테이블로 전달할 수 있으며 일상적인 쿼리의 실행 시간을 줄일 수 있습니다.

저는 현재 160GB까지 늘어난 Amazon 클라우드 인프라에서 MySQL 데이터베이스를 관리하고 있습니다.쿼리 성능은 괜찮습니다.악몽이 된 것은 백업, 복원, 슬레이브 추가 또는 전체 데이터 세트를 처리하는 모든 것, 심지어 대규모 테이블의 DDL입니다.덤프 파일을 완전히 가져오는 것이 문제가 되었습니다.자동화할 수 있을 만큼 프로세스를 안정적으로 만들기 위해서는 성능보다 안정성을 우선시하는 다양한 선택이 필요했습니다.SQL 백업을 사용하여 재해로부터 복구해야 한다면 며칠 동안 시스템이 다운될 것입니다.

SQL을 수평적으로 확장하는 것도 상당히 고통스럽고 대부분의 경우 처음에 데이터를 SQL에 저장하기로 선택할 때 의도하지 않은 방식으로 SQL을 사용하게 됩니다.샤드, 읽기 슬레이브, 멀티 마스터 등은 모두 DB로 수행하는 모든 작업에 복잡성을 추가하는 정말 형편없는 솔루션이며 그중 어느 것도 문제를 해결하지 못합니다.단지 어떤 방식으로든 완화할 뿐입니다.이러한 유형의 문제가 발생하는 규모의 데이터 세트에 접근하기 시작하면 MySQL(또는 실제로 모든 SQL)에서 일부 데이터를 이동하는 것을 강력히 제안합니다.

데이터베이스가 제대로 설계되지 않으면 수천 행의 성능이 저하될 수 있습니다.

적절한 인덱스가 있고, 적절한 엔진을 사용하고(여러 DML이 예상되는 곳에 MyISAM을 사용하지 마십시오), 파티셔닝을 사용하고, 용도에 따라 올바른 메모리를 할당하고, 물론 서버 구성이 양호하다면 MySQL은 테라바이트 단위의 데이터도 처리할 수 있습니다!

데이터베이스 성능을 향상시키는 방법은 항상 있습니다.

이는 쿼리 및 유효성 검사에 따라 다릅니다.

예를 들어, 나는 해당 테이블의 각 약물에 대해 15자 이상의 일반 이름 열이 있는 100,000개의 약물 테이블을 작업했습니다. 두 테이블 사이에 약물의 일반 이름을 비교하는 쿼리를 넣었습니다. 쿼리는 다음과 같습니다. 실행하는 데 더 많은 분이 소요됩니다. 마찬가지로 위에서 언급한 대로 id 열을 사용하여 약물 색인을 사용하여 약물을 비교하면 몇 초 밖에 걸리지 않습니다.

데이터베이스 크기는 바이트 및 테이블의 행 수 측면에서 중요합니다.가벼운 데이터베이스와 블롭으로 채워진 데이터베이스 사이에는 엄청난 성능 차이가 있음을 알 수 있습니다.디스크의 파일에 이미지를 보관하고 데이터베이스에 파일 이름만 넣는 대신 필드에 이진 이미지를 넣기 때문에 응용 프로그램이 중단된 적이 있습니다.반면에 많은 수의 행을 반복하는 것은 무료가 아닙니다.

아니요, 별로 중요하지 않습니다.MySQL 속도는 초당 약 700만 행입니다.그래서 당신은 그것을 꽤 많이 확장 할 수 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top