• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 1. 데이터 정의 문
    2. 데이터 조작 문
    1. CALL 구문
    2. DELETE 구문
    3. DO 구문
    4. HANDLER 구문
    5. INSERT 구문
    1. INSERT ... SELECT 구문
    2. INSERT DELAYED 구문
    3. INSERT ... ON DUPLICATE KEY UPDATE 구문
    6. LOAD DATA INFILE 구문
    7. LOAD XML 구문
    8. REPLACE 구문
    9. SELECT 구문
    10. 서브 쿼리 구문
    11. UPDATE 구문
    3. MySQL 트랜잭션과 잠금 문
    4. 복제 문
    5. Prepared Statements위한 SQL 구문
    6. MySQL 복합문 구문
    7. 데이터베이스 관리 문
    8. MySQL 유틸리티 문
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

13.2.5.2 INSERT DELAYED 구문

 INSERT DELAYED ...

INSERT 문 DELAYED 옵션은 특정 유형의 테이블 ( MyISAM 등)에 사용할 수있는 표준 SQL에 대한 MySQL 확장입니다. 클라이언트가 INSERT DELAYED 를 사용하면 서버에서 즉시 이해를 얻을 수 행은 테이블이 다른 어떤 쓰레드에 의해 사용되어 있지 않은 경우에 삽입되도록 대기합니다.

참고

INSERT DELAYED 는 테이블이 다른 곳에서 사용되지 않으면 일반 INSERT 보다 느립니다. 또한 서버가 지연된 행이있는 테이블에 대해 별도의 스레드를 처리하기위한 추가 오버 헤드가 있습니다. 즉, INSERT DELAYED 는 그것이 필요한 것을 실제로 확신하는 경우에만 사용하도록하십시오.

MySQL 5.6.6 현재 INSERT DELAYED 는 사용되지 않으며 이후 릴리스에서 제거됩니다. 대신 INSERT ( DELAYED 를 붙이지 않는)을 사용하십시오.

큐에 넣어 진 행은 테이블에 삽입 될 때까지 메모리에만 유지됩니다. 즉, mysqld를 강제로 (예를 들어, kill -9 로) 종료 된 경우 또는 mysqld가 예기치 않게 종료 된 경우, 아직 디스크에 기록되지 않은 큐에 넣어 진 모든 행이 삭제됩니다.

DELAYED 의 사용에는 다음과 같은 몇 가지 제한 사항이 있습니다.

  • INSERT DELAYED 는 MyISAM , MEMORY , ARCHIVE 및 BLACKHOLE 테이블에서만 작동합니다. DELAYED 를 지원하지 않는 엔진의 경우 오류가 발생합니다.

  • 삽입은 잠금을 보유하는 세션이 아니라 다른 스레드에 의해 처리 될 필요가 있기 때문에 LOCK TABLES 를 사용하여 잠긴 테이블에서 사용 된 경우, INSERT DELAYED 에 오류가 발생합니다 .

  • MyISAM 테이블에서는 데이터 파일의 중간에 빈 블록이 존재하지 않는 경우는 병렬 SELECT 및 INSERT 문이 지원됩니다. 이러한 상황에서는 MyISAM 에서 INSERT DELAYED 를 사용할 필요가 거의 없습니다.

  • INSERT DELAYED 는 값 목록을 지정하는 INSERT 문에서만 사용하도록하십시오. 서버는 INSERT ... SELECT 또는 INSERT ... ON DUPLICATE KEY UPDATE 문에서 DELAYED 를 무시합니다.

  • INSERT DELAYED 문은 즉시 복귀하기 위해 행이 삽입되기 전에 LAST_INSERT_ID() 를 사용하여이 문에 의해 생성 될 수있는 AUTO_INCREMENT 값을 얻을 수 없습니다.

  • DELAYED 행이 실제로 삽입 될 때까지 SELECT 문에 표시되지 않습니다.

  • MySQL 5.6 이전에는 문이 여러 행을 삽입하여 바이너리 로깅을 활성화해야하며, 글로벌 로깅 형식이 명령문 기반이다 (즉, binlog_format 가 STATEMENT 로 설정되어있을 때는 반드시 경우) INSERT DELAYED 는 통상의 INSERT 로 처리되었습니다. MySQL 5.6에서는 binlog_format 값이 STATEMENT 또는 MIXED 인 경우 반드시 INSERT DELAYED 는 항상 간단한 (즉, DELAYED 옵션이없는) INSERT 로 처리됩니다. (후자의 경우,이 문은 행 기반 로깅 전환을 트리거하지 않으므로 그 진술 기반 형식을 사용하여 기록됩니다.)

    이것은 행 기반의 바이너리 로깅 모드를 사용하는 ( binlog_format 가 ROW 로 설정되어있는) 경우에는 적용되지 않습니다. 이 경우, INSERT DELAYED 문은 항상 지정된대로 DELAYED 옵션을 사용하여 실행 된 행 업데이트 이벤트로 기록됩니다.

  • INSERT DELAYED 가 슬레이브에서 통상의 INSERT 로 처리되도록 DELAYED 는 슬레이브 복제 서버에서 무시됩니다. 이것은 DELAYED 를 위해 슬레이브 마스터와는 다른 데이터가 존재하게되는 경우가 있기 때문입니다.

  • 테이블에 쓰기 잠겨있을 때, 그 테이블 구조를 변경하기 위해 ALTER TABLE 을 사용하면 보류중인 INSERT DELAYED 명령문은 손실됩니다.

  • INSERT DELAYED 는 뷰에서 지원되지 않습니다.

  • INSERT DELAYED 는 파티션 된 테이블에서 지원되지 않습니다.

다음은 INSERT 또는 REPLACE 에 대한 DELAYED 옵션을 사용했을 때의 동작을 자세히 설명합니다. 이 설명에서는 "스레드"는 INSERT DELAYED 명령문을받은 스레드이며, '핸들러'는 특정 테이블에 대한 모든 INSERT DELAYED 명령문을 처리하는 스레드입니다.

  • 스레드가 테이블에 대한 DELAYED 명령문을 실행하면 그 테이블의 모든 DELAYED 명령문을 처리하기위한 핸들러 쓰레드가 생성됩니다 (이러한 핸들러가 존재하지 않는 경우).

  • 이 스레드는 핸들러가 이전에 DELAYED 락을 취득했는지 여부를 확인합니다. 취득하지 않은 경우에는 그것을 할 핸들러 스레드에 지시합니다. DELAYED 잠금은 다른 쓰레드가 테이블에 대한 READ 또는 WRITE 잠금을 보유하고있는 경우에도 얻을 수 있습니다. 그러나 핸들러는 테이블 구조를 항상 최신 상태로하기 위해 모든 ALTER TABLE 잠금이나 FLUSH TABLES 문이 완료 될 때까지 기다립니다.

  • 이 스레드는 INSERT 문을 실행하지만 행을 테이블에 쓰는 대신 마지막 행의 사본을 핸들러 쓰레드에 의해 관리되는 큐에 배치합니다. 구문 오류는 모든 스레드에 의해 검출 된 클라이언트 프로그램에보고됩니다.

  • INSERT 는 삽입 작업이 완료되기 전에 복귀하기 위해 클라이언트는 고유 한 행의 수, 결과 행의 AUTO_INCREMENT 값을 서버에서 가져올 수 없습니다. (C API를 사용하는 경우도 같은 이유에서 mysql_info() 함수는 의미있는 정보를 아무것도 돌려주지 않습니다.)

  • 바이너리 로그는 행이 테이블에 삽입 된 때 핸들러 쓰레드에 의해 업데이트됩니다. 여러 행 삽입의 경우 바이너리 로그는 첫 번째 행이 삽입 될 때 업데이트됩니다.

  • delayed_insert_limit 행이 기록 될 때마다 핸들러는 하나의 SELECT 문이 계속 보류 여부를 확인합니다. 보류중인 경우 계속하기 전에 이러한 실행을 허용합니다.

  • 핸들러의 큐에 그 이상행이 부족하면 테이블 잠금 해제됩니다. 새로운 INSERT DELAYED 문이 delayed_insert_timeout 초 이내에 접수되지 않은 경우, 핸들러는 종료합니다.

  • 특정 핸들러 큐에 delayed_queue_size 이상의 행이 보류중인 경우 INSERT DELAYED 를 요구하는 쓰레드는 큐에 공간이 생길 때까지 기다립니다. 이것은 지연된 메모리 큐의 메모리를 모두 mysqld에 의해 사용되어 버리지 않게하기 위해 이루어집니다.

  • 이 핸들러 쓰레드는 MySQL 프로세스 목록 Command 컬럼에 delayed_insert 로 나타납니다. 이것은 FLUSH TABLES 문을 실행하거나 KILL thread_id 에서 강제 종료하면 종료됩니다. 그러나 종료하기 전에 먼저 큐에 넣어 진 모든 행을 테이블에 저장합니다. 이 시간 동안 다른 스레드에서 새로운 어떤 INSERT 문을 허용하지 않습니다. 이 뒤에 INSERT DELAYED 명령문을 실행하면 새로운 핸들러 쓰레드가 생성됩니다.

    즉, 실행중인 INSERT DELAYED 핸들러가 존재하는 경우, INSERT DELAYED 문은 일반 INSERT 문보다 높은 우선 순위를 가지고 있습니다. 다른 업데이트 문은 INSERT DELAYED 큐가 비우는 지, 누군가가 ( KILL thread_id 에서)이 핸들러 스레드를 종료하거나 누군가가 FLUSH TABLES 를 실행할 때까지 대기해야합니다.

  • 다음 상태 변수는 INSERT DELAYED 명령문에 대한 정보를 제공합니다.

    상태 변수 의미
    Delayed_insert_threads 핸들러 스레드 수
    Delayed_writes INSERT DELAYED 로 쓰여진 행
    Not_flushed_delayed_rows 쓰기를 대기하고있는 행수

    이 변수는 SHOW STATUS 명령문을 발행하거나 mysqladmin extended-status 명령을 실행하여 볼 수 있습니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved