답변:
일반적으로 특정 요구 사항을 파악하고 대부분의 상황에서 가장 적합한 것을 기반으로 설계 결정을 내리지 않는 것이 좋습니다. 어느 것이 바람직 할 수있다. 다음은 수집해야 할 사항입니다.
두 가지 방법을 의도적으로 결합해야 할 수도 있습니다. 왜 ???
해당 테이블을 사용합시다 (MySQL- 방언)
CREATE TABLE mydata
(
id int not null auto_increment
firstname varchar(16) not null,
lastname varchar(16) not null,
zipcode char(5) not null,
...
deleted tinyint not null default 0
KEY (deleted,id),
KEY (deleted,lastname,firstname,id),
KEY (deleted,zipcode,id),
KEY (lastname,firstname),
KEY (zipcode),
PRIMARY KEY (id)
);
PRIMARY KEY를 제외하고 모든 색인 앞에는 deleted
플래그 가 붙어야 하고으로 끝나야합니다 id
.
삭제 표시 테이블을 만들어 봅시다
CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);
테이블에 이미 deleted
플래그가 있으면 툼 스톤 테이블을 채울 수 있습니다
INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;
이제 데이터와 묘비가 준비되었습니다. 삭제는 어떻게 수행합니까?
07305 우편 번호의 모든 사람을 삭제한다고 가정 해 봅시다. 다음을 실행하십시오.
INSERT IGNORE INTO mytomb SELECT id FROM mydata WHERE deleted=0 AND zipcode='07305';
UPDATE mydata SET deleted=1 WHERE deleted=0 AND zipcode='07305';
좋아, 이것은 당신이 그것을 보는 어느 쪽이든 많은 오버 헤드처럼 보입니다.
이제 삭제 된 모든 데이터를 보시겠습니까? 두 가지 방법이 있습니다.
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
mytomb의 ID 수가 mydata의 행 수의 5 %보다 큰 경우 전체 테이블 스캔입니다. 그렇지 않으면 각 행을 조회하는 인덱스 스캔. 이러한 점에서 벤치 마크에 유의하십시오. 설명 계획을 찾아보십시오.
이제 우편 번호 07304의 모든 사람을 보시겠습니까? 두 가지 방법이 있습니다.
SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'
대량 삭제는 어떻습니까? 두 가지 방법이 있습니다.
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
이제 두 가지 방법을 모두 유지한다고 말하지는 않습니다. 시간이 지남에 따라이 작업을 수행하면 전반적인 운영 측면에서 어떤 방법이 더 빠릅니다. 라이브 데이터 쿼리, 삭제 된 데이터 쿼리 및 대량 삭제에 가장 적합한 벤치 마크를 결정해야합니다.