MySQL의 성능 (A) 기본 최적화

A, SQL 문을 최적화

SQL을 사용하여 MySQL의 느린 쿼리 로그는 효율성 문제를 모니터링 :

// 슬로우 쿼리 로그는 열 수 있는지 여부를 확인합니다
'slow_query_log'와 같은 쇼 변수;

// 슬로우 쿼리 로그 저장 위치 확인
'slow_query_log_file'와 같은 쇼 변수;

슬로우 쿼리 로그를 켜 //
에 글로벌 slow_query_log을 = 설정;

// 슬로우 쿼리 로그 저장 위치가 지정
= 글로벌 show_query_log_file 설정 '/ / var에 lib 디렉토리 / mysql을 / 농가-slow.log';

// 레코드는 인덱스 SQL 사용하지 않는
글로벌 log_queries_not_using_indexes = ON SET를,

// 1 초는 SQL보다 더 많은의 질의 기록
하며 SET 공사 무료 LONG_QUERY_TIME = 1 가입
: 슬로우 쿼리 로그가 포함

# 사용자 @ 호스트 : 루트 [루트 ] @localhost [] // 의 호스트 정보 SQL 실행
#Query_time : 0.0000024 Lock_time : 0.00 Rows_sent : 0 Rows_esamined : 0 // SQL의 실행 정보
SET 타임 스탬프 = 1,402,389,324 // SQL 실행 시간
을 선택 * 상점에서; //의 SQL 내용

 

의 공식 MySQL의 느린 쿼리 로그 분석 도구 mysqldumpslow :

사용법 :

// 매개 변수의 목록을 확인
-h mysqldumpslow

처음 세 비교적 느린 SQL의에서 // 슬로우 쿼리 로그 분석
3 /var/lib/mysql/homestead-slow.log -t mysqldumpslow | 더보기

// 출력 스타일 효과
백작에게 :. 1 시간 : 0.00s의 0.00s의 = 행은 = 10.0 잠금
루트 [RPPT]는 @localhost
스토어에서 SELECT *

 

MySQL의의 느린 쿼리 로그 분석 도구 PT-쿼리 다이제스트 (더 자세하고 mysqldumpslow보다 포괄적 인 결과)

파일에 // 출력
속도가 느린 로그를 PT-쿼리 소화 > slow_log.report

// 데이터 테이블에
PT-쿼리 다이제스트 slow.log - 검토 \
H = 127.0.0.1, D = 시험, P는, U는 루트 = 루트, P = 3306 = T = query_review \
--create-reviewtable \
- - 검토 이력 t = hostname_slow

사용법 :

// 매개 변수의 목록을 확인
--help PT-쿼리가 소화를

처음 세 비교적 느린 SQL의에서 // 슬로우 쿼리 로그 분석
/var/lib/mysql/homestead-slow.log PT-쿼리 다이제스트 | 자세히보기

// 세 부분 출력
로그의 표시 시간 범위 및 총 개수와 다른 SQL SQL의 수 이외에 1
2.Response 시간 : 응답 시간 회계 통화 : SQL 실행 주파수
3.sql 특정 로그

 

슬로우 쿼리 로그가 문제가 SQL을 발견하여 다음과 같이 문제는 :

1. 더 자주 쿼리와마다 SQL 쿼리를 오래 점유
처음 몇 쿼리는 일반적으로 분석 PT-쿼리 소화

2.IO 큰 SQL (IO 수준에서 데이터베이스의 주요 병목)
주 행 항목 조사 분석을 PT-쿼리는 소화

3. 미스 인덱스 SQL의
참고 행 비교 분석을 검토하고 행은 PT-쿼리 다이제스트를 보냅니다.

 

SQL 쿼리 및 분석 실행 계획을 설명함으로써 것은
선택 CUSTOMER_ID,, FIRST_NAME, LAST_NAME에서 설명 고객;

 

 

최대 ()와 COUNT () 최적화 :

// 마지막 급여 기간을 조회 - 최대 최적화 () 함수를

지불에서 선택 최대 (PAYMENT_DATE)를 설명;

지불 (payment_data)에 인덱스 idx_paydate을 만들 ; // 인덱스 (색인을 포함) PAYMENT_DATE하기

// SQL 다수의 영화에서 2006 년과 2007 년 같은 시간에 알 - 최적화 카운트 () 함수

SELECT COUNT (RELEASE_YEAR = '2006'또는 null)로 '2006 년 영화의 수', COUNT (RELEASE_YEAR = '2007'또는 null) 영화에서 '영화의 2007 연간 수'와 같은;

() 설명을 수 :

 

 

 

 

 

 

 

하위 쿼리 최적화 :

정상적인 상황에서, 우리는 질의에 가입 쿼리 최적화를 처리 할 필요가 있지만, 키 - 많은 관계가 연관되어 있는지에주의 최적화 할 때, 데이터를 복제하기 위해주의를 기울입니다. (고유 디엠 퍼시스)

// 쿼리 산드라 출연 한 모든 영화

영화에서 선택 제목, RELEASE_YEAR, 길이를 설명

에 film_id 곳 (

어디에서 actor_id (FILM_ACTOR에서 film_id 선택

액터로부터 선택 actor_id 여기서 FIRST_NAME = '산드라'));

최적화에 의해 그룹

임시 테이블 전에 변경 //

sakila.film_actor에서 선택 actor.first_name, actor_last_name, COUNT (*)를 설명

내측 사용 sakila.actor 가입 (actor_id)

film_actor.actor_id 의해 기;

하위 인덱스 쿼리의 조합을 변경할 //

sakila.film_actor에서 선택 actor.first_name, actor.last_name, c.cnt 설명

내부 조인 (

(actor_id)를 사용하여 C로) actor_id 선택 actor_id 의해 sakila.film_actor 그룹에서 CNT로서 (*) 계산;

 

제한 최적화

일반적으로 페이징 과정에서 사용 제한 종종 대부분의 시간 Filesorts 사용할 수 있도록이 IO 문제가 많이 발생합니다 사용하는 ORDER BY 절과 함께.

// 파일 정렬, IO 큰

선택 film_id, 제목 제한 50,5하여 sakila.film 순서와 설명을 설명;

1. 최적화 (film_id 의해 순서) 동작에 의해 기본 키 열 또는 순서로 색인화

2. 다음 쿼리에서 기본 키 필터를 마지막으로 기본 키 레코드의 반환, 데이터 레코드의 과도한 스캔 큰 볼륨을 피하기 위해

, sakila.film에서 설명 film_id 선택 여기서 film_if> 55 film_id <= film_id 제한 1,5- 60 주문; 

페이지의 큰 숫자가 큰 IO

// 마지막 급여 기간을 쿼리 최대 () 함수를 최적화하기 위해 - EXPLAIN 은 SELECT 최대 (PAYMENT_DATE) 에서 , 지불을 만들기 인덱스 idx_paydate을 ON 하여 SQL에서 동시에 발견 // 지수 (인덱스를 포함하는) // PAYMENT_DATE하는, 지불 (payment_data를) 2006 년과 2007 년에 영화의 수 - 최적화 카운트 ()의 기능 은 SELECT COUNT (RELEASE_YEAR = '2006' 또는 널 (null) ) AS '2006 년 영화의 수' , COUNT (RELEASE_YEAR = '2007' 또는 널 (null) ) AS 2007 ', 영화의 수 ' 에서 필름; // 관련 수 () 함수 https://blog.csdn.net/wendychiang1991/article/details/70909958/

추천

출처www.cnblogs.com/lovechengyu/p/11490809.html