내일은 소설입니다.
sun's longitude:239 42 22.00 
· 자유게시판 · 묻고답하기 · 알파문서 · RPMS list
· 사용자문서 · 팁/FAQ모음 · 리눅스Links · 자료실
· 서버정보 · 운영자 · Books/FAQ · FreeBSD
/board/read.php:소스보기  
알파문서
자주 잊어먹거나, 메모해 둘 필요성이 있는 팁이나 문서, 기타 등등
[*** 쓰기 금지단어 패턴 ***]
글 본문 중간에 업로드할 이미지를 추가하는 방법 : @@이미지이름@@
ex) @@foo.gif@@
52 번 글: [MYSQL] 우선순위, LOW_PRIORITY, DELAYED, ...
글쓴이: 산이 [홈페이지] 글쓴날: 2014년 02월 04일 16:26:26 화(오후) 조회: 20474
-----------------------------------------
INSERT  [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] table_name ...
REPLACE [LOW_PRIORITY | DELAYED]          [INTO] table_name ...
UPDATE  [LOW_PRIORITY]           [IGNORE]        table_name ...
DELETE  [LOW_PRIORITY]           [QUICK]    FROM table_name ...
ALTER                            [IGNORE]  TABLE table_name ...
SELECT  [HIGH_PRIORITY] ...                 FROM table_name ...
-----------------------------------------

LOW_PRIORITY :

데이터를 SELECT 가 아닌 추가, 수정, 삭제할 경우에 해당되며,
다른 클라이언트가 SELECT 를 모두 마칠때까지 기다린 후 실행


DELAYED :

데이터를 추가할 경우에 해당되며, 메모리에 저장해 놓고
처리함
(클라이언트는 SELECT 가 끝날때까지 기다리지 않음)
항상 '1 rows affected' 의 결과를 냄


IGNORE :

PRIMARY KEY, UNIQUE KEY 에 대한 동일한 데이터를 추가, 수정, 삭제할
경우에 해당되며, 이런 에러를 무시하고 계속 진행함.


HIGH_PRIORITY :

데이터를 SELECT 검색할 경우에만 해당되며, 다른 작업보다
우선순위가
높음(SELECT 가 더 빈번한 경우에 사용)


-----------------------------------------

예제1) 입력 > 검색

데이터의 추가, 수정, 삭제가 검색(SELECT) 보다 더 빈번하여
입력쪽에 더 비중을 두고자 한다면,
데이터의 빠른 추가, 수정, 삭제가 요구되므로,

INSERT  DELAYED [IGNORE] [INTO] table_name ...
REPLACE DELAYED [INTO] table_name ...
UPDATE  [IGNORE] table_name ...
DELETE  QUICK FROM table_name ...
SELECT  ... FROM table_name ...


이와 SELECT 에는 HIGH_PRIORITY 를 사용하지 않는 것이 좋으며,
INSERT 나 REPLACE 에는 DELAYED 를 사용을 권함.


예제2) 입력 < 검색

데이터의 검색(SELECT)이 추가, 수정, 삭제 보다 더 빈번하여
데이터의 검색쪽에 더 비중을 두고자 한다면,
더 빠른 검색이 요구되므로 예제1과 그 반대로,

INSERT  LOW_PRIORITY [IGNORE] [INTO] table_name ...
REPLACE LOW_PRIORITY [INTO] table_name ...
UPDATE  LOW_PRIORITY [IGNORE] table_name ...
DELETE  LOW_PRIORITY FROM table_name
SELECT  HIGH_PRIORITY ... FROM table_name ...


이와 SELECT 에는 HIGH_PRIORITY 를 사용하는 것이 좋으며,
나머지는 LOW_PRIORITY 사용을 권함.

*참고)
CREATE TABLE table_name ( ... ) PACK_KEYS=1;
or
ALTER TABLE table_name PACK_KEYS=1;


예제3) 입력 '=. 검색

데이터 입력과 검색을 비슷한 비중으로 하고자 한다면,

INSERT  DELAYED [IGNORE]
REPLACE DELAYED
UPDATE  LOW_PRIORITY [IGNORE] <-- 아무래도 SELECT 보다 더 비중이
적으므로
DELETE  LOW_PRIORITY QUICK    <-- 아무래도 SELECT 보다 더 비중이
적으므로
SELECT  HIGH_PRIORITY

이와 같이 SELECT 쪽에 약간 더 비중을 두어 SQL 문을
완성하는 것이 좋음.


*참고1) INSERT INTO 와 REPLACE INTO

레코드에 어떤 데이터를 추가할때 기존에 같은 PRIMARY KEY 가
있으면 INSERT 는 에러를 냄.

반면,
REPLACE 는 기존에 같은 PRIMARY KEY 가 있으면, 기존의 레코드를
삭제(DELETE)하고
 새로 INSERT 하기 때문에 항상 '2 rows affected' 의
결과가 되고(DELETE and INSERT), 같은 PRIMARY KEY 가 없으면 이때는
INSERT 와 동일하게 '1 rows affected' 가 됨.

만약 테이블에서 PRIMARY KEY 나 UNIQUE 한 KEY 가 없다면,
REPLACE 구문은 필요가 없으며, 이때는 INSERT 구문을 사용해야 함


*참고2) INSERT INTO 와 INSERT DELAYED INTO

INSERT INTO 는 기존에 같은 PRIMARY KEY 가 있으면 에러를 내지만,
INSERT DELAYED INTO 내부적으로 SELECT 와 INSERT 가 이루어지기
때문에 에러없이 항상 '1 rows affected' 가 이루어짐.

즉, INSERT DELAYED INTO 는 기존에 같은 PRIMARY KEY 가 있으면,
현재의 데이터를 더 이상 INSERT 를 하지 않고, 
항상 '1 rows affected' 의 결과를 보냄.

바꾸어 말하면, 기존의 레코드는 수정(DELETE, UPDATE, REPLACE)되지
않고 그대로 있기 때문에, PRIMARY KEY 외에 다른 데이터가 서로
다를지라도 갱신되지 않음

바로 이점이 REPLACE INTO 나 REPLACE DELAYED INTO 와 서로 다름.
(REPLACE 는 기존의 레코드를 삭제하고 새로운 데이터가
추가되기
때문에 PRIMARY KEY 외의 다른 데이터는 갱신됨).

MySQL 매뉴얼에 의하면, INSERT DELAYED INTO 구문은 ISAM, MyISAM 테이블
에서만 가능하고, 사용할 수 없는 테이블에서는 INSERT 보다
느려진다고 함
(HEAP 테이블도 가능함)

  적용예
  1. SELECT COONT(*) FROM table WHERE mixed_primary_key_compare
  2. 만약 COONT(*) 값이 없다면,
     INSERT INTO table ...
     만약 COUNT(*) 값이 있다면,
     SKIP.

  이 2가지 과정을 한번에 처리할 수 있는 것이 바로 INSERT DELAYED
INTO 임

  INSERT DELAYED INTO table ...

만약 PRIMARY KEY 외의 다른 값들이 항상 새로운 값으로 갱신되기
원한다면 REPLACE INTO 나 REPLACE DELAYED INTO 를 사용하면 됨.


*참고3) REPLACE INTO 와 REPLACE DELAYED INTO

우선 이 두개의 결과는 항상 동일하며,
기존에 같은 PRIMARY KEY 가 있으면 REPLACE INTO 는 기존의
레코드를 삭제하고 INSERT 하는 반면, REPLACE DELAYED INTO 는
기존의 레코드를 UPDATE 하는 방식이므로 항상 '1 rows affected' 의
결과를 보냄.

  적용예
  1. SELECT COONT(*) FROM table WHERE mixed_primary_key_compare
  2. 만약 COUNT(*) 값이 없다면,
     INSERT INTO table ...
     만약 COONT(*) 값이 있다면,
     UPDATE TABLE table SET ... WHERE mixed_primary_key_compare

  이 2가지 과정을 한꺼번에 처리할 수 있는 방법이 바로,

  REPLACE DELAYED INTO table ...

기존에 같은 PRIMARY KEY 가 없다면 결과적으로 INSERT 함.


*참고4) INSERT DELAYED INTO 와 REPLACE DELAYED INTO

DELAYED 구문은 항상 '1 rows affected' 의 결과를 보낸다는 점을
감안하면, 전자는 SELECT + INSERT 이고, 후자는 SELECT + UPDATE
의 형식임.

즉, 기존에 같은 PRIMARY KEY 가 있다면, 전자는 항상 기존의
레코드는
그대로 있고(다른 컬럼도 갱신하지 않음), 후자는 항상 새로운
레코드로
UPDATE 함.

기존에 같은 PRIMARY KEY 가 없다면 결과적으로 모두 INSERT 함.

정리하면 다음과 같음.

<FONT FACE='굴림체'>
+-----------------+----------------------+-------------+----------+----------+
| 구분(same KEY)  | exits                | not exists  | 기존 row | 비고    
|
|-----------------+----------------------+-------------+----------+----------|
| INSERT          | error(FALSE), (0)    | INSERT, (1) |          |          |
|-----------------+----------------------+-------------| 갱신(X)  |----------|
| INSERT DELAYED  | SKIP(TRUE), (1)      | INSERT, (1) |          | 항상 (1) |
|-----------------+----------------------+-------------+----------+----------|
| REPLACE         | DELETE + INSERT, (2) | INSERT, (1) |          |          |
|-----------------+----------------------+-------------| 갱신(O)  |----------|
| REPLACE DELAYED | UPDATE, (1)          | INSERT, (1) |          | 항상 (1) |
+-----------------+----------------------+-------------+----------+----------+
</FONT>
*주1) 'same KEY' 는 PRIMARY KEY 또는 UNIQUE KEY 에 대한 row 존재 여부
*주2) PRIMARY KEY 또는 UNIQUE KEY 설정이 없으면 REPLACE 는 무의미함.
*주3) 괄호() 안의 숫자는 'number of rows affected'를 의미함.

 
이전글 : [MySQL] SELECT 결과의 출력물 제어(pager)
다음글 : [PHP] 파일 리턴 (a script file return)  
 from 106.240.239.66
JS(Redhands)Board 0.4 +@

|글쓰기| |답장쓰기| |수정| |삭제|
|이전글| |다음글| |목록보기|
인쇄용 

apache lighttpd linuxchannel.net 
Copyright 1997-2024. linuxchannel.net. All rights reserved.

Page loading: 0.01(server) + (network) + (browser) seconds