11 MySQL의 성능 최적화

최적화에 01- 소개

MySQL 데이터베이스 최적화는 원칙은 시스템의 응답 속도를 증가, 시스템 병목 현상을 줄이고 풋 프린트를 줄이기 위해 다각적된다.
1 , 파일 시스템을 최적화하는 I \ O 스케치 속도 디스크 개선,
 2 , 운영 체제를 최적화하기 위해 스케줄링 전략에 의해, 높은 부하 조건에서 MySQL의 부하 용량을 개선하기 위해
 3 그래서 쿼리가 쿼리 등 최적화 된 테이블 구조, 인덱스, 더 반응. 

MySQL은, 당신은 MySQL 데이터베이스의 성능 매개 변수의 일부를 조회 할 SHOW 상태 문을 사용할 수 있습니다. 
구문 구조는 다음과 같습니다 
상태 (STATUS)에서 LIKE SHOW ' 값을 ' ; 
일반적인 성능 매개 변수로 다음과 같습니다 : 
· 연결 : 연결 MySQL 서버의 수, 
· 가동 시간 : 온라인 시간 MySQL 서버; 
· Slow_queries : 슬로우 쿼리의 수 
· Com_select가 : 쿼리 작업 시간 ; 
· Com_insert : 삽입 작업의 수 
· Com_update : 업데이트 작업의 수 
· Com_delete : 수의 삭제.

02- 최적화 쿼리

쿼리를 분석함으로써, 쿼리의 구현을 이해할 수, 쿼리 최적화 쿼리에 병목 현상을 식별하기 위해 수행. 
MySQL은 문을 설명하고 쿼리를 분석하는 DESCRIBE 문을 제공합니다. 

기본 문 구문은 그대로 다음 EXPLAIN : 
SELECT (선택) [확장] select_options EXPLAIN 
추가 정보를 생성하는 문을 EXPLAIN 사용이 EXPLAIN 키워드. 
select_options WHERE 절 등 FROM 포함 쿼리 쿼리 옵션. 

문을 실행, 선택 문은 나중에 EXPLAIN의 구현을 분석 할 수 있으며, 일부 기능은 조회 된을 통해 분석 할 수 있습니다. 
예 : 
MySQL은 > SELECT * 에서 학생,
 + ------ + -------- + 
| S_ID | 이름 | 
+ ------ + -------- + 
| 1. | 리밍 | 
| 2 | wangwu | 
| 3 | 리시 |. 
+ ------ + -------- + 
3 행. 에서 SET이 (0.04 초) 

MySQL은 > SELECT *를 EXPLAIN 에서 학생;
+ ---- + ------------- + --------- ------------ + + + ------ --------------- + ------ + --------- + ------ + ------ + --- + ------- + ------- 
| 언급 된 ID 위 | SELECT_TYPE | 테이블 | 파티션 | 유형 |이 possible_keys | 열쇠 |있는 key_len | REF | 행 | 필터링 | 추가 | 
+ ---- + --- ---------- + --------- + --------- + ------ + --------- ------ + ------ + ------ + ------ + --------- + ---------- + - + ------ 
| 1 | SIMPLE | 학생 | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | NULL | 
+ ---- + ------------ - + --------- + --------- + ------ + --------------- + - --------- + + + ---- ------ ------ + + + ------- -------- 
1 행  는 SET 1 경고 (0.00 초) 

# 1의 쿼리 속도 지수에 미치는 영향 
MySQL의 데이터 테이블에서 가장 효과적인 방법 중 하나의 성능을 향상 합리적인 인덱스를 설계하는 것입니다.
인덱스를 사용하면 빠르게하여 데이터베이스 쿼리의 속도를 증가, 테이블에 레코드를 찾습니다. 
인덱스를 생성합니다 :
만들기 (이름) ON 학생 인덱스 INDEX_NAME, 

# 2, 인덱스 쿼리를 사용하여 
인덱스가 쿼리 속도를 향상시킬 수 있습니다. 그러나 쿼리 인덱스와 필드, 인덱스가 작동하지 않습니다. 
다음과 같은 특별한 상황 인덱스가 작동하지 않았다 : 
( 1 )을 LIKE 키워드 쿼리를 사용하여 
첫 번째 문자 문자열이 일치하는 경우 , 인덱스는하지 않습니다 작업 %를. 만 % 첫 번째 위치에, 인덱스가 작동하지 않습니다. 
예 : 
MySQL은 > 학생 (명) 인덱스 INDEX_NAME 만들기, 
쿼리 확인, 0 행이 영향 ( 0.05 초) 
기록 : 0 중복 : 0 경고 : 0 

MySQL의 > DESC SELECT * 에서 학생 WHERE 이름처럼 ' %의 L ' ;
+ ---- + ------------- + --------- ------------ + + + ------ --------------- + ------ + --------- + ------ + ------ + --- ------- + ------------- +
| ID | SELECT_TYPE | 표 | 파티션 | 입력 | 이 possible_keys | 키 | 있는 key_len | 심판 | 행 | 필터링 | 추가 | 
+ ---- + ------------- + --------- ------------ + + + ------ --------------- + ------ + --------- + ------ + ------ + --- ------- + ------------- + 
| 1 | SIMPLE | 학생 | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 33.33 | 여기서 사용 | 
+ ---- + ------------- + --------- ------------ + + + ------ --------------- + ------ + --------- + ------ + ------ + --- ------- + ------------- + 
1 행  세트 1 경고 (0.00 초) 

의 MySQL > DESC * 선택 로부터 ;
이름이 같은 학생 ' 리터 % ' + ---- + ------------- + --------- + ------------ + ------- + --------------- + ------------ + --------- + - ---- + ------ + ---------- + ----------------------- + 
| ID | SELECT_TYPE | 표 | 파티션 | 입력 | 이 possible_keys | 키 | 있는 key_len | 심판 | 행 | 필터링 | 추가 | 
+ ---- + ------------- + --------- ------------ + + ------- + --------------- + ------------ + --------- + ------ + --- --- + ---------- + ----------------------- + 
| 1 | SIMPLE | 학생 | NULL | 범위 | 인덱스 _ | 인덱스 _ | 768 | NULL | 2 | 100.00 | 인덱스 조건을 사용하여 | 
+ ---- + ------------- + --------- ------------ + + ------- + --------------- + ------------ + --------- + ------ + --- --- + ---------- + ----------------------- + 
1 행 에서 다음 SET 1 경고 (0.00 초) 

( 2 ) 멀티 컬럼 인덱스 쿼리 문은 
여러 필드에 인덱스를 만들 수 있습니다 MYSQL. 도 16은 인덱스 필드를 포함 할 수있다. 시간 인덱스를 들어, 첫 번째 필드에서 이러한 분야에서 사용만을 쿼리, 인덱스가 사용됩니다. 
다중 열 인덱스를 만듭니다 
과일 ON 인덱스 index_id_price (f_id, f_price)를 만듭니다, 
( 3 )을 OR 키워드 쿼리 사용하여 
검색 조건 문을 전용 또는 키워드 및 이전과 열 후 2 조건이 인덱스 때, 쿼리는 인덱스를 사용할 수 있습니다. 그렇지 않으면, 쿼리는 인덱스를 사용하지 않습니다.
# 최적화 1, 서브 쿼리 
MySQL의 중첩 된 쿼리 select 문이 될 수있는 하위 쿼리를 사용하여 지원 서브 쿼리에 시작, 4.1 버전. 
하위 쿼리는 유연한 쿼리 할 수 있지만 효율이 높은 것은 아니다. 하위 쿼리의 구현은, MySQL은 내부 쿼리의 결과로 임시 테이블을 만들 필요가있다. 
그런 다음 외부 쿼리 쿼리는 임시 테이블에서 기록합니다. 
쿼리가 완료되면, 다음이 임시 테이블을 철회. 

MySQL은, 당신은 다른 하위 쿼리를 쿼리 가입 할 수 있습니다. 
쿼리에 참여하는 것은 쿼리가 인덱스를 사용하는 경우, 빠른 서브 쿼리의 속도보다 임시 테이블을 만들 필요가 없습니다, 그 성능이 더 좋을 것이다.

데이터베이스 구조를 최적화 03-

데이터베이스 구조의 디자인, 당신은 데이터 중복성을 고려 쿼리 속도를 업데이트해야하는 필드의 데이터 유형은 합리적이고 많은 다른 콘텐츠입니다. 

# 1은, 복수의 테이블에 테이블 번호 필드 
이상의 필드 테이블은, 사용 빈도가 일부 필드는 새로운 테이블을 다음 필드를 형성하기 위해 분리 될 수도 낮다. 
데이터 테이블로 인해 사용 필드 저주파의 존재로, 큰 경우이므로 둔화. 

# 테이블의 중간을 증가 2, 
테이블에 자주 통합 쿼리에 대한 필요성, 당신은 쿼리 성능을 향상시킬 수있는 중간 테이블을 만들 수 있습니다. 
테이블의 중간을 구축함으로써, 데이터를 삽입하는 쿼리 성능을 향상하기 위해 테이블의 중간에 자주 공동 조회하고 테이블의 공동 중간에 쿼리 원래 쿼리가 필요합니다. 

# 3, 중복 필드를 증가 
쿼리 속도를 향상시킬 수있는 중복 필드를 추가 합리적. 

# 4, 삽입 기록 속도의 최적화 
기록이 삽입되고, 삽입 속도는 주로 인덱스 만 체크 레코드 수 일회용 인서트에 영향을 미친다. 다음은 녹화 속도 최적화 방법에 삽입 : 
    테이블의 MyISAM 엔진의 경우 : 
    ( 1 ) 사용 안 함 인덱스 
    비어 있지 않은 테이블, 레코드를 삽입, MySQL은 레코드를 삽입하는 인덱스 테이블에 따라 색인됩니다. 당신은 많은 데이터를 삽입하는 경우, 색인 감속은 기록을 삽입했다. 
이 문제를 해결하기 위해, 당신은 기록을 삽입하기 전에 색인을 사용하지 않도록 설정할 수 있습니다. 데이터 후 완전히 개방 인덱스에 삽입된다. 
다음과 같이 사용 안 함 인덱싱 문은 다음과 같습니다 
테이블 변경이 DISABLE KEYS를 TABLE_NAME,  
TABLE_NAME 인덱스 테이블을 해제 할 수있는 테이블의 이름입니다.
인덱스 문이 그대로 다음 다시 엽니 다
ALTER TABLE은 테이블 _ 키를 ENABLE; 
만의 MyISAM 엔진 테이블이 데이터 가져 오기 후 색인되기 때문에 대량 가져 오기 빈 테이블 데이터에 대해, 이것은 필요하지 않습니다. 

    ( 2 ) 하나 개의 체크 비활성화 
    MySQL이 기록 지닝 유일성 체크를 삽입하는 것, 데이터가 삽입된다. 이 고유성 검사가 삽입 된 기록 속도가 느려집니다. 
    쿼리 속도에 미치는 영향을 줄이기 위해, 당신은 녹화가 오픈에 삽입 한 후 완료 될 때까지 기록을 삽입하기 전에 고유성 검사를 비활성화 할 수 있습니다. 
고유성 확인 문을 중지하면 그대로 다음과 
는 SET UNIQUE_CHECKS = 0; 
오픈 유일성 체크 문 그대로 다음과 
는 SET UNIQUE_CHECKS = 1이다. ] 
    ( 3. 대량 삽입을 사용) 
    (가) 복수의 레코드 삽입 삽입 문을 사용할 수있다 때 레코드 또는 레코드를 삽입 ; 빠르게 여러 구문 동시에 삽입. 
    ( 4 )이 LOAD DATA INFILE의 대량 가져 오기를 사용하여 
   대량 가져 오기 데이터가 이용 LOAD DATA INFILE 문 경우, 가능한 한 사용할 때. LOAD DATA INFILE 문의 속도가 빠른 삽입 문 이상의 데이터를 가져올 수 있기 때문에. 

    InnoDB의 테이블 엔진의 경우 : 
    ( 1)는 하나 개의 체크를 해제하려면
    데이터 실행 UNIQUE_CHECKS SET 삽입하기 전에 고유 인덱스의 체크를 해제 한 후 데이터 가져 오기가 완료된다. 1 = UNIQUE_CHECKS SET 실행 = 0 . 
    ( 2 ) 안 외래 키 검사 
    한 다음, 데이터를 삽입하기 전에 외부 키 확인을 금지 수행 삽입이 완료된 후에 외부 키를 확인하기 위해 데이터를 복원한다. 
    안 외래 키 검사 문이 그대로 다음 : 
    다음 SET FOREIGN_KEY_CHECKS = 0; 
    있는 그대로 다음 외부 키 체크 문을 복원 
    후 SET FOREIGN_KEY_CHECKS . = 1 ; 
    ( . 3 ) 자동 제출하지 않도록 
    데이터 가져 오기가 완료된 후 자동으로 데이터를 삽입하기 전에 금지 트랜잭션을 제출이 수행 복구 자동 제출 작동. 
    다음과 같이 사용 안함 자동 제출 문은 다음과 같습니다 
    SET 자동 커밋 = 0; 
    문이 자동으로 다음과 같이 복원 출원 : 
    자동 커밋 SET = 1;.

 

# 5, 테이블 분석 및 최적화 체크리스트 테이블 
    , 분석 표는 주로 키워드 분석을 배포 
    오류에 대한 체크리스트를 주로 체크리스트를, 
    기본 테이블의 최적화 업데이트 또는 공간에 의해 발생을 낭비 제거하기 위해 삭제됩니다. 
    ( 1 ) 분석 테이블 
    MySQL은 분석 테이블 TABLE 문을 분석 제공, 기본 구문 규칙으로 다음과 같습니다 : 
(가) [로컬 시스템 ANALYZE | NO_WRITE_TO_BINLOG] 표 tb1_name을 [tb1_name] ... 
LOCAL 키워드는 모두, 별칭 NO_WRITE_TO_BINLOG 키워드입니다 구현 프로세스가 바이너리 로그에 기록되지 않습니다, tb1_name 분석 테이블은 테이블 이름, 당신은 하나 이상을 가질 수 있습니다. 

표 테이블을 분석하여 공정 분석, 데이터베이스 시스템이 자동으로 읽기 전용 테이블 인덱스를 추가합니다. 
분석 기간 동안 만 테이블에서 레코드를 읽고, 삽입 된 레코드를 업데이트 할 수 없습니다. 
이노, BDB와 MyISAM 테이블 유형을 분석 할 수 TABLE 문을 분석 할 수 있습니다. 
예 : 
MySQL의 > Analyze (분석) 표 학생,
 + ----------------- + --------- + ---------- + - + -------- 
| 테이블 | 사설 | MSG_TYPE | MSG_TEXT |
+ ----------------- + --------- + ---------- + ---------- + 
| test_db.student | Analyze (분석) | 현황 | 확인 | 
+ ----------------- + --------- + --------- - + ---------- + 
1 행. 에서 SET (0.01 초) 

    ( 2 ) 체크리스트 
    MySQL의 체크 표 문을 확인하는 데 사용할 수 있습니다. CHECK TABLE 문 검사 오류 이노와의 MyISAM 테이블 유형. 
    MyISAM 테이블 유형의 경우, CHECK TABLE 문은 키워드 통계를 업데이트합니다. 
    오류보기가있는 경우 CHECK 표도 확인할 수 있습니다. 
    기본 구문 구조가 그대로 다음과 
    CHECK 표 tb1_name [tb1_name] ... [옵션] ... 
    옵션 = {빠른 | 빠른 | MEDIUM, | 확장 | 변경} 
tb1_name 테이블 이름, 여기서, 옵션 파라미터가 각각 다섯 개 값을 가지며, 그것은 빠르고 빠른 | | MEDIUM, | EXTENDED | 변경됩니다. 
각 옵션의 의미는 다음과 같습니다
· QUICK : 마 스캔하지 라인 
· FAST : 만 검사가 종료되지 않은 제대로 테이블 
· 변경 : 마지막 검사의 변경 후 테이블을 확인하는 것은 제대로 닫히지 않은 테이블
· MEDIUM : 삭제 된 연결이 유효한지 확인하기 위해, 라인 스캔. 
· EXTENDED : 각 행의 모든 키워드가 포괄적 인 키워드 검색 될 것이기 때문. 
InnoDB만을 테이블 유형에 대한 유효 MyISAM 테이블 유형에 대한 옵션은 무효. 테이블에 추가합니다 구현 과정에서 CHECK TABLE 문은 읽기 전용 잠금. 

    ( 3 ) 최적화 테이블 
    테이블을 최적화하기 위해 OPTIMIZE TABLE 문을 사용하여 MySQL을한다. 이노와의 MyISAM 테이블 유형에 대한 설명이있다. 그러나, OPTIMIZE 표 문은 테이블에 VARCHAR, BLOB 또는 필드의 텍스트 유형을 최적화 할 수 있습니다. 
  기본 구문 OPTIMIZE TABLE 문은 그대로 다음과 
 OPTIMIZE [로컬 시스템 | NO_WRITE_TO_BINLOG] 표 tb1_name [tb1_name] .... 

을 제거해 삭제 및 업데이트 파일 조각화 OPTIMIZE TABLE 문에 의해 발생. 테이블에 추가합니다 구현 과정에서 OPTIMIZE TABLE 문은 읽기 전용 잠금.

04- 최적화 된 MySQL 서버

# 1, 최적화 서버 하드웨어 
서버 하드웨어 성능을 직접 MySQL 데이터베이스의 성능을 결정합니다. 
하드웨어 성능 병목의 MySQL 데이터베이스를 직접 운영 속도와 효율성을 결정한다. 
다음은 서버 하드웨어 최적화하는 방법으로서, 
( 1 ) 큰 메모리 구성. 
( 2 ) 고속의 디스크 장치는 디스크의 대기 시간을 감소시키는 응답 속도를 증가 시키도록 구성. 
( 3 ) 적절한 분배 디스크 I \ O는, 복수의 장치는 자원에 대한 경쟁이 감소 병렬로 작동 할 수있는 능력을 향상시키기 위해서는, 디스크에 분산. 
( 4 ) 멀티 프로세서 구성은, MySQL 데이터베이스는 다중 스레드, 다중 동시에 다수의 스레드를 실행할 수있다. 

# 2, MySQL을의 매개 변수를 최적화 
MySQL 서버의 성능을 향상 시키도록 자원 활용을 향상시킬 수있는 매개 변수의 MySQL의 최적화에 의해,. 
MySQL의 서버 구성 매개 변수의 my.cnf 또는 my.ini 파일 파일 [mysqld를] 그룹에 있습니다.

 

추천

출처www.cnblogs.com/pgxpython/p/11736553.html