MySQL 은 어떻게 데 이 터 를 빠르게 가 져 옵 니까?

선언:
일상적인 학습 과 업무 중 에 자주 데 이 터 를 유도 하 는 수 요 를 만 날 수 있다.예 를 들 어 데이터 이전,데이터 복구,라 이브 러 리 에서 새로 만 드 는 등 이런 조작 은 대량의 데이터 가 져 오기 와 관련 될 수 있다.가끔 은 도입 진도 가 느 리 고 컴퓨터 선풍기 가 미 친 듯 이 돌아 가 는 것 이 정말 사람 을 붕괴 시 킵 니 다.사실은 일부 작은 기 교 는 도입 을 더욱 빠르게 할 수 있 습 니 다.이 글 에서 필 자 는 데 이 터 를 어떻게 신속하게 가 져 오 는 지 에 대해 이야기 합 니 다.
주:이 글 은 논리 백업 으로 만들어 진 SQL 스 크 립 트 를 어떻게 빨리 가 져 오 는 지 에 대해 서 만 논의 하고 있 으 며,다른 파일 형식 은 논의 하지 않 습 니 다.
1.가 져 오 는 파일 크기 최소 화
우선 가 져 온 데 이 터 를 내 보 내 려 면 MySQL 자체 명령 행 도 구 를 사용 하고 Navicat,workbench 등 그래 픽 도 구 를 사용 하지 않도록 권장 합 니 다.특히 빅 데 이 터 량 의 경우 마 이 SQL 이 자체 적 으로 가 져 온 명령 행 도구 로 내 보 내 거나 가 져 오 는 것 이 네 이 비 케 이 트 등 그래 픽 도구 로 빅 데 이 터 량 을 만 드 는 것 보다 몇 배 빠 르 고,네 이 비 케 이 트 등 그래 픽 도구 로 조작 할 때 쉽게 끊 겨 죽는다.MySQL 자체 명령 행 도구 로 가 져 오기 내 보 내기 방법 을 간단히 소개 합 니 다.

#       
mysqldump -uroot -pxxxxxx --all-databases > all_database.sql

#      
mysqldump -uroot -pxxxxxx --databases testdb > testdb.sql

#      
mysqldump -uroot -pxxxxxx testdb test_tb > test_tb.sql

#     SQL   (    testdb  )
mysql -uroot -pxxxxxx testdb < testdb.sql
가 져 온 SQL 스 크 립 트 의 내용 은 대부분 라 이브 러 리 를 만 들 고 데 이 터 를 삽입 하 는 것 입 니 다.그 중에서 가장 오래 걸 리 는 것 은 insert 가 데 이 터 를 삽입 하 는 것 입 니 다.파일 크기 를 줄 이기 위해 확장 삽입 방법,즉 여러 줄 을 함께 일괄 insert 를 사용 하 는 것 을 추천 합 니 다.이와 같 습 니 다:insert into tablename values (),(),(),...,(); 。확장 삽입 을 사용 하면 한 줄 한 줄 삽입 보다 파일 크기 가 훨씬 작고 삽입 속도 가 몇 배 빠르다.mysqldump 를 사용 하여 내 보 낸 파일 은 기본적으로 대량으로 삽입 하 는 방법 을 사용 합 니 다.내 보 낼 때--skip-extended-insert 파 라미 터 를 조목조목 삽입 하 는 것 으로 바 꿀 수 있 습 니 다.다음은 천만 장의 데이터 시트 를 예 로 들 어 서로 다른 방식 으로 내 보 낸 파일 이 삽 입 될 때의 속 도 를 측정 한다.

위의 그림 에서 보 듯 이 확 장 된 SQL 스 크 립 트 를 사용 하여 가 져 오 는 데 10 분 정도 걸 리 지만 한 줄 씩 삽 입 된 SQL 스 크 립 트 가 져 오 는 시간 이 너무 길 어서 약 1 시간 동안 가 져 오지 못 했 습 니 다.2 개 이상 의 G 텍스트 가 져 오기 한 시간 이 넘 도록 끝나 지 않 았 습 니 다.기다 리 지 못 한 필 자 는 수 동 으로 취 소 했 습 니까?하지만 여러 개의 insert 가 한 개의 데 이 터 를 삽입 하 는 것 보다 몇 배의 시간 을 절약 하 는 것 을 알 수 있다.
2.매개 변 수 를 수정 하여 가 져 오 는 속 도 를 가속 화 하려 고 시도 합 니 다.
MySQL 에 유명한'쌍 일'인자,즉 innodb 가 있 습 니 다.flush_log_at_trx_commt 와 syncbinlog 。보안 을 위해 이 두 매개 변 수 는 기본 값 이 1 입 니 다.스 크 립 트 를 빠르게 가 져 오기 위해 서 이 두 매개 변 수 를 임시로 수정 할 수 있 습 니 다.다음은 이 두 매개 변 수 를 간단하게 소개 합 니 다.
innodb_flush_log_at_trx_commt 기본 값 은 1 이 고 0,1,2 로 설정 할 수 있 습 니 다.
하면,만약,만약...flush_log_at_trx_commt 설정 은 0 입 니 다.log buffer 는 1 초 에 한 번 씩 log file 에 기록 하고 log file 의 flush(디스크 에 브러시)작업 을 동시에 진행 합 니 다.이 모드 에 서 는 트 랜 잭 션 을 제출 할 때 디스크 에 기록 하 는 작업 을 주동 적 으로 실행 하지 않 습 니 다.
하면,만약,만약...flush_log_at_trx_commt 는 1 로 설정 되 어 있 습 니 다.트 랜 잭 션 을 제출 할 때마다 MySQL 은 log buffer 의 데 이 터 를 log file 에 기록 하고 flush(디스크 에 브러시)에 기록 합 니 다.
하면,만약,만약...flush_log_at_trx_commt 는 2 로 설정 되 어 있 으 며,트 랜 잭 션 을 제출 할 때마다 MySQL 은 log buffer 의 데 이 터 를 log file 에 기록 합 니 다.그러나 flush(디스크 에 브러시)작업 은 동시에 진행 되 지 않 습 니 다.이 모드 에서 MySQL 은 1 초 에 한 번 씩 flush(디스크 로 닦 기)작업 을 수행 합 니 다.
sync_binlog 기본 값 은 1 이 고[0,N 으로 설정 가능)
동기 화binlog=0,운영 체제 가 다른 파일 을 닦 는 메커니즘 처럼 MySQL 은 디스크 에 동기 화 되 지 않 고 운영 체제 에 의존 하여 binary log 를 새로 고 칩 니 다.
동기 화binlog=N(N>0),MySQL 은 N 번 바 이 너 리 로 그 를 쓸 때마다 fdatasync()함 수 를 사용 하여 바 이 너 리 로 그 를 디스크 에 동기 화 합 니 다.
이 두 개의 매개 변 수 는 온라인 으로 수정 할 수 있 습 니 다.빠르게 가 져 오 려 면 다음 절차 에 따라 조작 할 수 있 습 니 다.

# 1.  MySQL             
set global innodb_flush_log_at_trx_commit = 2;
set global sync_binlog = 2000;

# 2.  SQL    
mysql -uroot -pxxxxxx testdb < testdb.sql

# 3.            
set global innodb_flush_log_at_trx_commit = 1;
set global sync_binlog = 1;
또 다른 장면 은 라 이브 러 리 를 새로 만 들 거나 binlog 를 만 들 필요 가 없다 는 것 입 니 다.이 럴 때 SQL 스 크 립 트 를 가 져 올 때 binlog 를 기록 하지 않 고 스 크 립 트 시작 에 set sql 을 추가 할 수 있 습 니 다.log_bin=0; 그리고 가 져 오 기 를 실행 하면 속도 가 더욱 빨 라 집 니 다.MySQL 인 스 턴 스 가 binlog 를 열지 않 았 다 면 이 문 구 를 실행 할 필요 가 없습니다.
요약:
이 글 은 주로 데 이 터 를 빠르게 가 져 오 는 방법 을 소개 합 니 다.load data 나 프로그램 다 중 스 레 드 삽입 등 다른 방법 도 있 을 수 있 습 니 다.본 고 에서 소개 한 방법 은 SQL 스 크 립 트 를 수 동 으로 가 져 오 는 데 만 적합 하 며 본 고 에서 언급 한 방법 을 요약 한다.
  • MySQL 자체 명령 행 도 구 를 사용 하여 내 보 내기 가 져 오기.
  • 4.567917.확장 삽입 방법 을 사용 하여 하나의 insert 가 여러 값 에 대해..임시 수정 innodbflush_log_at_trx_commt 와 syncbinlog 인자..4.567917.binlog 를 닫 거나 임시로 binlog 를 기록 하지 않 습 니 다.
    사실 색인 을 만 들 지 않 고 데 이 터 를 삽입 한 후에 색인 추가 작업 을 수행 하 는 다른 방안 도 있 습 니 다.또는 시 계 를 MyISAM 또는 MEMORY 엔진 으로 바 꾸 고,가 져 오기 가 완료 되면 InnoDB 엔진 으로 바꾼다.그러나 이 두 가지 방법 은 실시 하기 가 비교적 번 거 롭 고 효과 가 어떤 지 모르겠다.상기 방법 은 필자 가 개인 경험 에 따라 정리 한 것 일 뿐 전면적 이지 않 을 수 있 습 니 다.여러분 의 보충 을 환영 합 니 다.
    이상 은 MySQL 이 데 이 터 를 어떻게 신속하게 가 져 오 는 지 에 대한 상세 한 내용 입 니 다.MySQL 가 져 오 는 데이터 에 대한 자 료 는 다른 관련 글 에 주목 하 십시오!

    좋은 웹페이지 즐겨찾기