MySQL 조회 캡 처 에 대한 심도 있 는 분석
1.my sql 의 튜 닝 대강
show profile 은 SQL 이 Mysql 서버 에서 의 실행 세부 사항 과 생명주기 상황 을 조회 합 니 다
my sql 의 join 실현 원 리 는 구동 표 의 데 이 터 를 바탕 으로'끼 워 넣 기 순환'이 구동 표 에 일치 하 는 기록 을 하 는 것 이다.드라이버 의 색인 은 효력 을 잃 고 드라이버 의 색인 은 유효 합 니 다.
# a 10000 ,b 20
select * from a join b on a.bid =b.id
a b :
for 20
10000 ( on a.bid=b.id , B+ )
:20+ log10000
b a
for 10000
20 ( on a.bid=b.id , B+ ) :10000+ log20
3,in 과 existsexists 사용
# in , B A
select * from A where id in (select id from B)
# exists , A B
select * from A where exists(select 1 from B where B.id = A.id)
결론:
B A , in
A B , exist
4,orderby 생 성 표
create table tblA(
#id int primary key not null auto_increment,
age int,
birth timestamp not null
);
insert into tblA(age, birth) values(22, now());
insert into tblA(age, birth) values(23, now());
insert into tblA(age, birth) values(24, now());
#
create index idx_A_ageBirth on tblA(age, birth);
orderby 명중 색인 의 경우
orderby 가 색인 에 명중 하지 않 은 경우
orderby 구문 자체 가 색인 을 사용 하 는 가장 왼쪽 앞줄
4.567917.MySQL 4.1 이전 에는 이중 정렬 을 사 용 했 는데 글자 그대로 디스크 를 두 번 스 캔 하여 데 이 터 를 얻 었 다 는 뜻 이다.줄 포인터 와 orderby 열 을 읽 고 정렬 한 다음 정렬 된 목록 을 스 캔 하고 목록 의 값 에 따라 목록 에서 해당 하 는 데 이 터 를 다시 읽 습 니 다
select * from user where name = "zs" order by age
#
1) name name = 'zs' id
2) id , age id sort buffer( )
3) name name = 'zs' id
4) 2、3 name = 'zs'
5) sort_buffer age id age
6) id age , id
#
1) name name ='zs' id
2) id , , sort_buffer( )
3) name name = 'zs' id
4) 2、3 name = 'zs'
5) sort_buffer age ,
단일 정렬 문제 및 최적화
:
,
sort_buffer , B A , B , sort_buffer , sort_buffer , ( tmp , ), sort_buffer , …… I/O。
:
sort_buffer_size
max_length_for_sort_data
:
Order by select * , Query 。 , I/O 。
5,groupby 최적화1)group by 는 실질 적 으로 정렬 한 후 그룹 을 나 누 어 색인 의 가장 좋 은 왼쪽 접 두 사 를 따른다.
2)색인 열 을 사용 할 수 없 을 때 max 증가length_for_sort_data 매개 변수 설정+증대 sortbuffer_size 매개 변수 설정
3)where 가 having 보다 높 으 면 where 에 한 정 된 조건 을 쓸 수 있 으 면 having 에 한정 하지 마 세 요.
4)나머지 규칙 은 모두 order by 와 일치한다
2.느 린 조회 로그
1.느 린 조회 로 그 는 무엇 입 니까?
기본적으로 MySQL 의 느 린 조회 로 그 는 열 리 지 않 았 습 니 다.변조 가 필요 하지 않 으 면 이 인 자 를 시작 하 는 것 을 권장 하지 않 습 니 다.느 린 조회 로 그 를 열 면 성능 에 영향 을 줄 수 있 기 때문에 느 린 조회 로 그 는 로그 기록 을 파일 에 기록 하 는 것 을 지원 합 니 다.
a)느 린 조회 로그 열기
#
show variables like 'slow_query_log%';
# , my.cnf
set global slow_query_log = 1 ;
b)느 린 조회 로그 의 한도 값 설정
# 10s
show variables like 'long_query_time%';
# 3s , my.cnf
set global long_query_time = 3
# ,
show variables like 'long_query_time%';
c)지속 화 느 린 조회 로그 와 시간 한도 값
[mysqld]
#
slow_query_log=1;
slow_query_log_file=/var/lib/mysql/hadoop102-slow.log
long_query_time=3;
log_output=FILE
d)느 린 조회 사례
# 4s
select sleep(4);
# linux ,
cat /var/lib/mysql/hadoop102-slow.log
e)현재 시스템 에 존재 하 는 느 린 조회 로그 갯 수 보기
show global status like '%Slow_queries%';
3,로그 분석 명령 mysqldumpslowa)매개 변수 해석
-s:어떤 방식 으로 정렬 하 는 지
c:방문 횟수
l:잠 금 시간
리 턴 레코드
t:조회 시간
al:평균 잠 금 시간
ar:평균 반환 기록 수
at:평균 조회 시간
-t:앞의 몇 개의 데 이 터 를 되 돌려 주기 위해 서 입 니 다.
-g:뒤쪽 에 정규 일치 모드 를 맞 추고 대소 문자 가 민감 하지 않 습 니 다.
b)상용 방법
# 10 SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/hadoop102-slow.log
# 10 SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/hadoop102-slow.log
# 10
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/hadoop102-slow.log
# | more
mysqldumpslow -s r -t 10 /var/lib/mysql/hadoop102-slow.log | more
3.데이터 스 크 립 트 대량 작성1.건축 표
CREATE TABLE dept
(
deptno int unsigned primary key auto_increment,
dname varchar(20) not null default '',
loc varchar(8) not null default ''
)ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE emp
(
id int unsigned primary key auto_increment,
empno mediumint unsigned not null default 0,
ename varchar(20) not null default '',
job varchar(9) not null default '',
mgr mediumint unsigned not null default 0,
hiredate date not null,
sal decimal(7,2) not null,
comm decimal(7,2) not null,
deptno mediumint unsigned not null default 0
)ENGINE=INNODB DEFAULT CHARSET=utf8;
2.저장 함수 작성 자 를 신뢰 할 수 있 는 지 설정 합 니 다.
# binlog
show variables like 'log_bin%';
#
set global log_bin_trust_function_creators = 1;
3,생 성 함수
무 작위 문자열 생 성 함수
# $$ ( ;)
delimiter $$
create function rand_string(n int) returns varchar(255)
begin
declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
declare return_str varchar(255) default '';
declare i int default 0;
while i < n do
set return_str = concat(return_str,substring(chars_str,floor(1+rand()*52),1));
set i=i+1;
end while;
return return_str;
end $$
무 작위 부서 번호 생 성 함수
delimiter $$
create function rand_num() returns int(5)
begin
declare i int default 0;
set i=floor(100+rand()*10);
return i;
end $$
4,저장 프로시저 생 성emp 표 에 데 이 터 를 삽입 하 는 저장 과정 을 만 듭 니 다.
delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
set autocommit = 0;
repeat
set i = i+1;
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values((start+i),rand_string(6),'salesman',0001,curdate(),2000,400,rand_num());
until i=max_num
end repeat;
commit;
end $$
dept 표 에 데 이 터 를 삽입 하 는 저장 과정 을 만 듭 니 다.
delimiter $$
create procedure insert_dept(in start int(10),in max_num int(10))
begin
declare i int default 0;
set autocommit = 0;
repeat
set i = i+1;
insert into dept(deptno,dname,loc) values((start+i),rand_string(10),rand_string(8));
until i=max_num
end repeat;
commit;
end $$
5.저장 프로 세 스 를 호출 하여 데 이 터 를 생 성 합 니 다.
# 10
DELIMITER ;
CALL insert_dept(100, 10);
# 50w
CALL insert_emp(100001, 500000);
4.show profiles1,소개
4.567917.show profile 은 my sql 이 현재 세 션 에서 실 행 된 자원 소모 상황 을 분석 할 수 있 도록 제공 합 니 다.SQL 의 변조 측정 에 사용 할 수 있 습 니 다
# Show Profile
show variables like ‘profiling%';
# Show Profile
set profiling=on;
3,show profiles 사용테스트 데이터 생 성
select * from emp group by id%10 limit 150000;
select * from emp group by id%10 limit 150000;
select * from emp group by id%10 order by 5;
select * from emp
select * from dept
select * from emp left join dept on emp.deptno = dept.deptno
실행 쇼 프로 파일show profile cpu,Block io for query Query 실행ID;
검색 매개 변수
ALL:모든 지출 정보 표시
BLOCK IO:블록 IO 관련 비용 표시
CONTEXT SWITCHES:상하 문 전환 관련 비용
CPU:CPU 관련 지출 정보 표시
IPC:지출 정보 전송 및 수신 표시
메모리 관련 지출 정보 표시
PAGE FAULTS:페이지 오류 관련 비용 정보 표시
SOURCE:디 스 플레이 와 Sourcefunction,Source_file,Source_라인 관련 지출 정보
SWAPS:교환 횟수 와 관련 된 지출 정 보 를 표시 합 니 다.
결과 되 돌리 기
converting HEAP to MyISAM:조회 결과 가 너무 커서 메모리 가 부족 해서 디스크 로 옮 겼 습 니 다.
Creating tmp table:임시 표를 만 듭 니 다.my sql 은 먼저 데 이 터 를 임시 표 에 복사 한 다음 에 다 쓴 다음 임시 표를 삭제 합 니 다.
Copying to tmp table on disk:메모리 에 있 는 임시 시 계 를 디스크 에 복사 하면 위험 합 니 다!!
locked:시계 잠 금
전역 조회 로그
생산 환경 설정 에서 사용 하지 마 십시오.
my.cnf 에 설정
#
general_log=1
#
general_log_file=/path/logfile
#
log_output=FILE
인 코딩 사용
set global general_log=1;
set global log_output='TABLE';
설정 이 완료 되면 mysql 라 이브 러 리 에 기 록 된 geneal로그 테이블
select * from mysql.general_log;
총결산여기 서 MySQL 조회 캡 처 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 MySQL 조회 캡 처 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.