오늘은 소설입니다.
sun's longitude:239 52 9.87 
· 자유게시판 · 묻고답하기 · 알파문서 · RPMS list
· 사용자문서 · 팁/FAQ모음 · 리눅스Links · 자료실
· 서버정보 · 운영자 · Books/FAQ · FreeBSD
/board/delete.php:소스보기  
알파문서
자주 잊어먹거나, 메모해 둘 필요성이 있는 팁이나 문서, 기타 등등
[*** 쓰기 금지단어 패턴 ***]
글 본문 중간에 업로드할 이미지를 추가하는 방법 : @@이미지이름@@
ex) @@foo.gif@@
 ★ 글 지우기 항목입니다. 한번 더 생각하시고 결정하십시오.!!!
제목 52 : [MYSQL] 우선순위, LOW_PRIORITY, DELAYED, ...
 이름  산이 [홈]http://linuxchannel.net/
-----------------------------------------
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'를 의미함.
2014년 02월 04일 16:26:26 화(오후)  from 106.240.239.66
0
암호: 공용 보안 SSL 서버가 준비되기 전까지는 off 합니다

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

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