고성능의 MySQL (2) : 스키마 데이터 유형 및 최적화

우선, 최적의 데이터 형식을 선택할

(1) 더 작고 더 나은

덜 메모리, CPU의 캐시 및 처리 사이클, 디스크를 차지하기 때문에, 최소한의 범위를 초과하지 않는 유형을 선택합니다.

예컨대 DATETIME 및 TIMESAMP 열은 동일한 데이터 유형 저장할 수 날짜 및 시간, 초 단위까지 정확하지만, 단지 절반 TIMESAMP DATETIME 수납 공간.

(2) 간단한의 충분한

간단한 종류의 CPU 처리 사이클을 줄일 수 있습니다. 예를 들어, 작업을 형성하는, 플라스틱에 비해 조합 복잡한 문자 세트 문자의 비용보다 낮은

(3) NULL을 피하려고

정말 저장 될 필요하지 않는 한 가장 잘 NOT NULL, NULL 값으로 지정. 조회가 NULL 열 어려운 쿼리 최적화에 포함되어있는 경우, 같은 NULL 열 수 인덱스, 통계 값의 비교가 더 복잡하고 더 많은 저장 공간을 사용하여 NULL 열이 될 수있게 할 수 있습니다. 열이 NULL 수도 인덱스 경우, 각 바이트의 양에 대한 기록이 필요합니다.

1.1 정수 유형

스토리지는 정수 TINYINT 될 수 있다면, SMALLINT, MEDIUMINT, INT, GIGINT, 16,24,32,64가 저장 공간으로 사용되는 한 통상적으로 64 비트 정수 계산된다 BIGINT 정수 , MySQL이 지정할 수 있으며, 예를 들어, 정수 INT의 폭 (11)뿐만 이해가되지 않습니다, 그것은 직접 사용 BIGINT 될 수 있습니다.

1.2 실제 유형

소수 부분의 실수입니다. 때문에 여분의 공간, 포인트 FLOAT는 DOUBLE과 DEDCIMAL 유형이 정밀도를 지정할 수 있습니다 플로팅 및 오버 헤드를 계산하는 것은, 그렇게 사용하려고에만 소수점 경우에만 소수의 정확한 계산 (예를 들어, 재무 데이터)

케이스 : DECIMAL (18,9) : 메모리 9 소수점 숫자의 각각의 양측에 전후 각각 4 바이트, 1 개 바이트 소수의 소수점 후 9 바이트의 총.

1.3 문자열 유형

(1) 가변 길이 문자열 기억 VARCHAR 형 고정 길이의 CHAR 타입 VARCHAR보다 적은 공간을 , 그 공간 (이하하여 짧은 문자열의 공간)을 사용할 필요가 있기 때문에

케이스 : 공간에서 사용 VARCHAR (5)와 VARCHAR (200) 스토리지는 '안녕하세요'오버 헤드, 동일 그 어떤 장점이 짧은 (5) 목록의 사용?

A : MySQL은 내부 값을 저장하기 위해 고정 된 크기의 메모리 블록을 할당하기 때문에 더 이상 컬럼의 가장 큰 장점은 정말 최고의 필요 일반적으로 공간의 크기를 할당, 더 많은 메모리를 소모합니다.

(2) BLOB과 TEXT 형식

String 데이터 유형은 헹로 설계 어쩌면 큰 데이터, 그리고 문자는 바이너리에 저장됩니다. 실제로 사용하지 않도록하십시오, 성능 저하

1.4 날짜 및 시간 유형

절반 저장 공간을 사용 TIMESAMP DATETIME은, 더 일반적으로 사용되는 적은 비용이 든다.

DATETIME 보통 "2019년 1월 1일 22시 23분 8초"이 기준 표시로 표시하는 정수 YYYYMMDDHHMMSS으로, 9999 1001, 패키지의 날짜 및 시간을 더 큰 값을 저장;

TIMESAMP 1970 년 1 월 1 일부터 초 단위로 저장, 그것은 정수 저장, 보증 시간 표시입니다.

 

둘째, 캐시 테이블과 요약 테이블

때때로 또한 성능을 향상시킬 수 있습니다 동일한 테이블의 중복 데이터에서 파생 된 절약이 같은 "통계."

캐시 테이블 : 그 메모리를 비교적 용이하게 얻기 위해 (그러나 느린 각 인수) 다른 테이블 데이터 테이블;

요약 : 저장 문 BY 그룹은 데이터의 집계 테이블을 사용하는 것입니다

2.1 요약

케이스 : 24시간 전송 된 메시지의 수, 쿼리 가장 활성 사용자, 일반 라벨, 몇 가지 전형적인 예를 계산하기 전에.

경우로 전송 된 메시지의 수를 계산하기 전에 24 시간 :

(1) 엄격하게 계산되지 않고, 시간 당 같은 간단한 쿼리를 수행 할 수 있습니다, 요약 테이블을 생성 할 수 있으며, 실시간 카운터 및 효율적인보다 유지;

(2) 요약 테이블은 통계라는 msg_per_hr 가정 엄격한 수, 모두 함께 통계표 23 시간 전에 전체 수, 플러스 시작의 마지막 수가 아닌 전체 시간, 기반으로 할 수 있습니다. 은 "고성능 MySQL은"케이스에서 다음과 같은 :

어느 쪽이든 - 실시간 계산이 작동하기 매우 고가이기 때문에 대부분의 데이터 테이블을 스캔하기 때문에 엄격하게, 효율적으로 계산 된 메시지보다 테이블의 모든 행의 격차 엄격한 수를 채울 계산 또는 소규모 문의하여 없습니다.

2.2 캐시 테이블 (표 중간체)

이러한 쿼리는 일반적으로 특별한 테이블과 인덱스 구조를 요구, 방법 반대 캐시 테이블과 요약 테이블은 자사의 검색을 최적화 및 검색 쿼리는 매우 효과적입니다.

케이스 : 수행 할 수 있습니다, 다음 캐시 테이블을 만들 필요가 테이블에있는 컬럼의 주요 부분을 포함 인덱스 쿼리의 가족의 많은 다른 유형의 조합을 필요로 캐시 테이블에 서로 다른 스토리지 엔진을 사용하여 기본 테이블이 InnoDB의 버퍼를 사용하는 경우, 예를 들어, MyISAM 테이블 작은 풋 프린트됩니다 스토리지 엔진 지표로 사용되며, 전체 텍스트 검색을 할 수 있습니다.

2.3, 카운터 테이블

카운터를 업데이트 할 때 테이블에 카운터 저장을, 당신은 동시성 문제가 발생할 수 있습니다. 다운로드 한 파일과 같은 카운터 사용자의 친구 캐시와 같은 응용 프로그램의 수입니다. 당신은 별도의 테이블을 만들 수 있습니다, 쿼리 캐시 실패는 피할 수있다

 

셋째, ALTER 테이블의 작업의 속도를 가속

큰 테이블에 테이블 변경은 큰 문제입니다. 당신이 빈 테이블로 새로운 사랑을 당신과 함께 테이블의 구조를 수정하여 새 테이블 삽입 이전 테이블에서 모든 데이터를 찾은 다음 이전 테이블을 삭제할 때 내부는 일반적으로 만들었습니다.

이 작업은 아니더라도 충분한 메모리 테이블과 특히 대형 많은 시간이 소요됩니다.

3.1 만있는 .frm 파일을 수정

그러나 재건의 원인이됩니다 모든, 럼의 디폴트 값은 실제로 존재 .FRM 파일 테이블을 직접 ALTER 열 조작에 의한 열에 대한 기본값을 변경하려면 테이블 자체를 수정할 필요없이 파일을 수정할 수 있도록 :

 

3.2, 신속의 MyISAM 인덱스를 만들

 (1) 인덱스 테이블의 MyISAM 인 경우, 신속하게 일반적인 기술이 테이블을 업데이트 : 심장 아 비활성화 된 인덱스는 데이터를로드 한 후 다시 활성화 (인덱스가 느린 빠른 쿼리, 추가 및 삭제로 이어질 것) 인덱스를 :

 작업이 데이터가 완전히로드 될 때까지 지연되기 때문에 인덱스를 생성 한 후,이 시간이 훨씬 빨라집니다 인덱스를 정렬하여 건설하고,보다 컴팩트 (그러나 고유 인덱스가 무효 인) 인덱스 적은 나무 파편을하게 할 수있다.

현재 버전의 이노 버전 (2)

모든 비 고유 인덱스를 삭제하고 삭제 된 인덱스를 다시 만들기 마침내 새 열을 추가합니다.

 

이전 : https://blog.csdn.net/RuiKe1400360107/article/details/103727285

다음 : https://blog.csdn.net/RuiKe1400360107/article/details/103783635

  参考资料:《高性能MySQL 第三版》

 

### 若对你有帮助的话,欢迎点赞!评论!转发!谢谢!

发布了52 篇原创文章 · 获赞 116 · 访问量 5万+

추천

출처blog.csdn.net/RuiKe1400360107/article/details/103778112