초고속 읽기 및 간단한 데이터 구조에 적합한 DBMS는 무엇입니까?


16

작업의 일부로 많은 파일 / 디렉토리를 추적 해야하는 제품을 개발 중입니다. 아이디어는 데이터베이스에 통계 정보를 저장 한 다음 부팅시 각 ​​파일에 대한 감시를 작성하는 것입니다. 변경된 파일은 그룹이 원격 데이터베이스에 동기화하기 위해 데이터베이스에 대기합니다. 우선 순위에 따라 1-10 사이의 숫자로 동기화됩니다.

데이터베이스에 대한 정보 :

  • 통계 정보의 <100,000 항목
  • 부팅시 전체 데이터베이스 읽기, 파일 경로 만 필요
  • 대기중인 파일에는 우선 순위 필드가 있습니다 (다른 검색 대상은 없음)
  • 삽입이 느려질 수 있습니다

작동한다고 생각되는 몇 가지 데이터베이스를 찾았지만 어느 것이 가장 좋은지 잘 모르겠습니다.

  • Redis- 파일 경로를 키로, 통계 데이터를 값으로 저장합니다. 대기열은 목록이 될 것입니다
  • MongoDB -Redis보다 더 많은 쿼리 옵션이지만 여전히 빠릅니다.

관계형 논리가 너무 많지 않고 총 데이터 크기가 너무 크지 않기 때문에 NoSQL 데이터베이스가 여기에서 가장 좋은 솔루션이라고 생각합니다 (100MB 미만, 30MB 미만). SQLite는 설치 가능한 응용 프로그램에 포함하기에 충분히 간단 해 보이기 때문에 SQLite를 보았습니다.

이는 고부하 서버가 아닌 최종 사용자를위한 분산 응용 프로그램이므로 데이터베이스는 많은 동시 사용자를 지원할 필요가 없습니다. 여기서 가장 우선 순위는 모델이 가장 적합한 데이터베이스를 찾는 것입니다.

그렇다면이 상황에 가장 적합한 데이터베이스는 무엇입니까?

또한 이와 같은 응용 프로그램에 더 적합한 다른 데이터베이스가 있습니까?

답변:


9

가장 먼저 떠오르는 것은 내게 익숙한 특정 RDBMS입니다. 그러나이 응용 프로그램에 적합하지 않을 수도 있습니다.

따라서 제 충고는 여러분에게 친숙한 데이터베이스를 사용하는 것입니다. Redis 또는 MongoDB에 익숙하다면 그 중 하나를 사용하십시오. SQLite에 더 익숙하다면 그것을 선택하십시오.

이 크기의 데이터베이스에서는 모든 것이 매우 빠릅니다. 디스크를 많이 사용하는 데이터베이스조차도 일종의 캐싱을 사용하므로 디스크 속도가 그다지 걱정되지 않습니다.


예, 해당 크기의 데이터베이스는 완전히 메모리 부족 상태로 제공 될 수 있습니다.
Nick Chammas

1
나는 MySQL (그러나 몇 년이 지났음), CouchDB 및 Redis (방금 시작)에 익숙하며 SQLite에는 참조 할 수있는 비슷한 구조가 있습니다. 나는이 크기의 db로 너무 중요하지 않다고 생각한다.
beatgammit

12

관계형 논리에 관심이없고 실제로 빠른 읽기 속도를 원하며 RDBMS와 함께 기꺼이 작업하려는 경우 편견적으로 MySQL을 사용하려고합니다. 왜 ???

MyISAM 스토리지 엔진에는 성능 향상을 위해 테이블의 물리적 구조를 확장 할 수있는 옵션이 있습니다. 그 옵션은 무엇입니까? ALTER TABLE 옵션 ROW_FORMAT.

예를 들어, MySQL Database Design and Tuning 책은 72,73 페이지의 ROW_FORMAT = FIXED를 사용하도록 권장합니다. 내부적으로 모든 VARCHAR 필드를 CHAR로 변환합니다. MyISAM 테이블은 더 커지지 만 실행 된 SELECT는 훨씬 빠릅니다. 나는 이것을 개인적으로 증명할 수 있습니다. 한때 1.9GB의 테이블이있었습니다. ALTER TABLE tblname ROW_FORMAT = FIXED로 형식을 변경했습니다. 테이블은 3.7GB가되었습니다. 그것에 대한 SELECT의 속도는 다른 것을 개선하거나 변경하지 않고 20-25 % 더 빠릅니다.

데이터로 채워진 MyISAM 테이블이 이미 있으면 어떻게합니까? MyISAM 테이블에있는 데이터를 기반으로 권장 열 정의에 대한 메트릭을 얻을 수 있습니다. 어떤 쿼리가 이러한 메트릭을 제공합니까?

SELECT * FROM tblname PROCEDURE ANALYSE();

절차 분석 () 데이터를 표시하지 않습니다. 모든 열의 값을 읽고 열 정의를 권장합니다. 예를 들어, 값이 1-4 인 유형 열이있는 경우 해당 4 개의 값 중 ENUM을 사용하여 제안됩니다. 그런 다음 TINYINT 또는 CHAR (1)은 동일한 양의 공간 (1 바이트)을 사용하므로 사용할 수 있습니다.

고려해야 할 다른 사항이 있습니다. NoSQL DB 사용에 대해 생각하고 있었으므로 NoISA 방식으로 MyISAM을 사용하는 것을 생각해 본 적이 있습니까? 이것은 가능합니다. 내가 언급 한 같은 책의 175 페이지HANDLER 구조를 사용 하여 관계형 수하물이없는 테이블을 읽을 것을 제안 합니다 . 실제로 175 페이지에서이 예제를 제공합니다.

CREATE TABLE customer_mileage_details
(
    customer_id INT NOT NULL,
    ff_number CHAR(10) NOT NULL,
    transaction_date DATE NOT NULL,
    mileage SMALLINT NOT NULL,
    INSERT(customer_id),
    INSERT (ff_number,transaction_date)
) ENGINE = MYISAM;

이 테이블에는 수백만 개의 행이 있습니다. 다음 요구 사항이있는 데이터 분석 곱셈을 작성해야한다고 가정하십시오.

  • 가능한 한 빨리 정보 블록을 검색해야합니다.
  • 사용자 입력 또는 기타 요인에 따라 표에서 "이동"할 수 있습니다.
  • 동시성 또는 기타 데이터 무결성 문제와 관련이 없습니다.
  • 애플리케이션 간 테이블 잠금이 필요하지 않습니다.

이 명령들은 테이블에서 빠르고 더러워진 읽기를 허용합니다 :

HANDLER customer_mileage_details OPEN;
HANDLER customer_mileage_details READ ff_number FIRST WHERE ff_number=('aaetm-4441');
HANDLER customer_mileage_details READ NEXT LIMT 10;
HANDLER customer_mileage_details CLOSE;

나는 이것이 생각을위한 음식을주기를 바란다. 살펴보세요.

경고

이 특정 게시물을 작성하는 것에 대해 매우 아이러니 한 것은 Percona Server 바이너리에서 HANDLER를 사용하고 있으며 사용이 오래되었다고 생각한 이전 게시물을 썼다는 것 입니다. 그 오래된 포스트 이후로, 나는 HANDLER 구조를 지원하기 위해 무언가를 쓸 것이라고 생각한 적이 없습니다. 나는 이제 고쳐졌다.


1
MySQL을 NoSQL 데이터베이스로 사용하는 것에 대한 흥미로운 점이 있지만 Redis 또는 MongoDB와 같은 것을 사용하여 무엇을 구매해야합니까?
beatgammit

1
빠르고 더러운 대답? 보고 목적으로 만 관계형 모델로 돌아 가야하는 경우 전환을 위해 모든 종과 휘파람이 있습니다. 또한 MyISAM의 NoSQL 스타일 액세스와 함께 관계형 작업을 계속 사용할 수 있습니다. BTW InnoDB는 또한 HANDLER가 데이터에 액세스 할 수 있도록합니다.
RolandoMySQLDBA

안녕하세요 @RolandoMySQLDBA, HANDLER구조 및 기능 에 대한 자세한 정보를 찾고 있습니다 .mysql 의 맨 페이지는 찾을 수 없었던 유일한 단일 페이지이며 그다지 많지 않습니다 ... 여기에 새로운 질문 : dba.stackexchange.com/q/253653/23271 추가 리소스에 대해 알고 싶습니까?
oucil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.