itsource

성능 저하가 시작되기 전에 MySQL 데이터베이스를 얼마나 크게 만들 수 있습니까?

mycopycode 2023. 1. 28. 09:35
반응형

성능 저하가 시작되기 전에 MySQL 데이터베이스를 얼마나 크게 만들 수 있습니까?

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

  • 물리적 데이터베이스 크기가 중요합니까?
  • 레코드 수가 중요합니까?
  • 성능 저하가 선형 또는 지수적입니까?

저는 거의 2GB를 차지하는 약 1500만 개의 레코드가 있는 대용량 데이터베이스를 가지고 있습니다.이러한 수치를 바탕으로 데이터를 삭제해야 하는 동기가 있습니까?아니면 몇 년 더 확장해도 안전한가요?

물리적 데이터베이스 크기는 중요하지 않습니다.기록의 수는 중요하지 않다.

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

저는 중간 정도의 연결 수로 최대 10GB의 용량을 확보했습니다만, 요청은 정상적으로 처리되었습니다.

먼저 인덱스에 초점을 맞추고 다음으로 서버 관리자에게 OS를 조사하도록 하겠습니다.이 모든 것이 도움이 되지 않으면 마스터/슬레이브 구성을 구현할 때가 될 수 있습니다.

일반적으로 이것은 매우 미묘한 문제이며 결코 사소한 것이 아니다.mysqlperformanceblog.com과 하이 퍼포먼스 MySQL을 읽어보시기 바랍니다.나는 이것에 대한 일반적인 답이 없다고 생각한다.

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

레코드의 수는 테이블 모양에 따라 달라집니다.varchar 필드가 많거나 몇 개의 int 또는 longs만 있으면 차이가 있습니다.

데이터베이스의 물리적 크기도 중요합니다. 예를 들어 백업을 생각해 보십시오.사용 중인 엔진에 따라 물리적 DB 파일은 증가하지만 축소되지는 않습니다(innodb 등).따라서 행을 많이 삭제해도 실제 파일을 축소하는 데 도움이 되지 않습니다.

이 문제에는 많은 것들이 있고 많은 경우에서와 같이 사소한 것에도 골칫거리가 있다.

데이터베이스 크기는 중요합니다.레코드가 100만 개 이상인 테이블이 여러 개 있는 경우 성능이 저하되기 시작합니다.물론 레코드의 수는 퍼포먼스에 영향을 미칩니다.MySQL은 테이블이 클 경우 속도가 느려질 수 있습니다.100만 레코드를 달성한 경우 인덱스가 올바르게 설정되지 않으면 성능 문제가 발생합니다(예: 조인에서 "WHERE 문" 또는 "ON 조건"에 필드에 대한 인덱스가 없음).1000만 건을 돌파하면 지수를 모두 맞혀도 성능 문제가 생기기 시작합니다.하드웨어 업그레이드(메모리의 증설과 프로세서 파워, 특히 메모리의 증설)는 퍼포먼스를 적어도 어느 정도 향상시킴으로써 가장 심각한 문제를 줄이는 데 도움이 되는 경우가 많습니다.를 들어 베이스캠프 데이터베이스 서버의 경우 37개의 신호가 32GB RAM에서 128GB RAM으로 변경되었습니다.

현재 Amazon의 클라우드 인프라에서 160GB로 늘어난 MySQL 데이터베이스를 관리하고 있습니다.쿼리 성능은 정상입니다.백업, restore, 슬레이브 추가 등 전체 데이터셋 또는 대형 테이블의 DDL을 처리하는 모든 작업이 악몽처럼 되었습니다.덤프 파일의 클린 Import는 문제가 되고 있습니다.프로세스를 자동화하기에 충분히 안정적인 상태로 만들기 위해서는 성능보다 안정성을 우선시하는 다양한 선택이 필요했습니다.SQL 백업을 사용하여 재해로부터 복구해야 하는 경우 며칠 동안 작업을 중단해야 합니다.

SQL을 수평으로 확장하는 것도 매우 번거로운 일이며, 대부분의 경우 데이터를 SQL에 넣는 것을 선택할 때 의도하지 않았던 방식으로 SQL을 사용하게 됩니다.Shads, read slave, multi-master 등은 모두 DB를 사용하여 수행하는 모든 작업에 복잡성을 가중시키는 정말 형편없는 솔루션입니다.이들 중 어느 하나도 문제를 해결하지 못하고 몇 가지 방법으로만 문제를 완화합니다.이러한 유형의 문제가 되는 데이터셋에 접근하기 시작할 때 MySQL(또는 실제로 모든 SQL)에서 일부 데이터를 이동하는 것을 적극 권장합니다.

업데이트: 몇 년 후 데이터 세트가 약 800 GiB로 증가했습니다.또한 200 GiB 이상의 단일 테이블과 50-100 GiB 범위의 기타 테이블이 있습니다.내가 전에 말했던 모든 것이 유효하다.성능은 여전히 양호하지만 전체 데이터 집합 작업을 실행하는 문제는 더욱 심각해졌습니다.

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

맞아요.또 다른 일반적인 방법은 반복적으로 작업하는 데이터의 양을 줄이는 것입니다.'오래된 데이터'와 '새로운 데이터'가 있고 쿼리의 99%가 새로운 데이터로 동작하는 경우 오래된 데이터를 모두 다른 테이블로 이동하기만 하면 됩니다.그냥 참조하지 마십시오.

-> 파티셔닝에 대해 살펴봅니다.

2GB와 약 1500만 장의 레코드는 매우 작은 데이터베이스입니다.펜티엄 III(!)로 훨씬 큰 것을 실행해 봤는데, 모든 것이 아직 꽤 빠르게 실행되고 있습니다.속도가 느리면 데이터베이스/어플리케이션 설계 문제이지 mysql 문제가 아닙니다.

'데이터베이스 퍼포먼스'를 말하는 것은 무의미하고 '쿼리 퍼포먼스'가 더 좋은 용어입니다.답은 쿼리, 조작 대상 데이터, 인덱스, 하드웨어 등에 따라 달라집니다.스캔할 행의 수와 EXPLIDE 구문에 사용할 인덱스를 파악할 수 있습니다.

2GB는 '대형' 데이터베이스로 간주되지 않습니다.중형 사이즈에 가깝습니다.

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

복잡한 결합도 주의해야 합니다.트랜잭션의 복잡성은 트랜잭션의 양 외에도 큰 요인이 될 수 있습니다.

대량의 쿼리를 리팩터링하면 퍼포먼스가 크게 향상되는 경우가 있습니다.

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

예를 들어, 차량의 GPS 모니터링 기능이 있는 시스템의 경우 이전 몇 달 동안 차량 위치에 대한 관련 쿼리 데이터가 없습니다.

따라서 데이터를 다른 이력 테이블에 전달하여 참조할 수 있으며 일상적인 쿼리 실행 시간을 단축할 수 있습니다.

데이터베이스가 적절하게 설계되지 않으면 수천 줄 만에 성능이 저하될 수 있습니다.

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

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

질의와 검증에 따라 달라집니다.

예를 들어, 나는 10만 개의 약물의 표를 가지고 그 표의 각 약물에 대해 15자 이상의 일반 이름을 가진 열로 작업했다.나는 두 테이블 사이에 약물의 총칭 비교를 위한 쿼리를 넣었다.쿼리를 실행하는 데 더 많은 시간이 걸립니다.마찬가지로, 약물 인덱스를 사용하여 id 열을 사용하여 약물을 비교하면(위에서 설명한 바와 같이), 몇 초밖에 걸리지 않습니다.

데이터베이스 크기는 바이트 및 테이블의 행 번호 측면에서 중요합니다.라이트 데이터베이스와 블롭이 채워진 데이터베이스 간에 큰 성능 차이가 있습니다.이미지를 디스크에 파일에 보관하고 파일 이름만 데이터베이스에 저장하는 대신 이진 이미지를 필드에 넣었기 때문에 응용 프로그램이 중단되었습니다.한편, 다수의 행을 반복하는 것은 무료가 아닙니다.

아니, 그건 별로 중요하지 않아.MySQL 속도는 초당 약 700만 행입니다.따라서 확장성이 매우 높습니다.

쿼리 성능은 주로 스캔해야 하는 레코드 수에 따라 달라지며 인덱스는 스캔해야 하는 레코드 수에서 높은 역할을 하며 인덱스 데이터 크기는 행 수와 인덱스 수에 비례합니다.

인덱스된 필드 조건과 전체 값이 포함된 쿼리는 일반적으로 1ms 후에 반환되지만 starts_with, IN, Between 조건에는 검사하는 레코드가 많을수록 시간이 더 걸릴 수 있습니다.

또한 ALTER와 같이 DDL에 대한 많은 유지보수 문제에 직면하게 됩니다.DROP은 인덱스나 새로운 컬럼을 추가해도 라이브 트래픽이 늘어나기 때문에 느리고 어렵습니다.

일반적으로 데이터베이스를 필요한 수의 클러스터로 클러스터하는 것이 좋습니다(일반적인 벤치마크는 500GB가 여러 요소에 따라 다르며 사용 사례에 따라 다를 수 있음). 이렇게 하면 보다 나은 분리와 특정 클러스터 확장에 대한 독립성이 확보됩니다(B2B의 경우 더 적합합니다).

언급URL : https://stackoverflow.com/questions/1276/how-big-can-a-mysql-database-get-before-performance-starts-to-degrade

반응형