관계형 논리에 관심이없고 실제로 빠른 읽기 속도를 원하며 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 구조를 지원하기 위해 무언가를 쓸 것이라고 생각한 적이 없습니다. 나는 이제 고쳐졌다.