2013-09-06 2 views
0

상위 폴더에서 중복 된 파일 이름을 잡는 데 가장 효율적인 코드를 찾으려고합니다. 나는 혈통과 부모 - 자식 모델을 사용하여 MySQL 데이터베이스에 파일 트리를 저장 해요 :
1. 실행 쿼리 :MySQL의 디렉토리 트리에있는 고유 한 파일 이름

INSERT INTO filetable (name, parent_id, path_num, path_string) 
    SELECT '$name','$pid','$path_num','$path_string' FROM DUAL 
     WHERE NOT EXISTS 
      (SELECT name FROM filetable WHERE name='$name'); 

및 PHP에서

CREATE TABLE `filetable` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(50) NOT NULL, 
    `parent_id` int(11) NOT NULL, 
    `path_num` varchar(255) NOT NULL, 
    `path_string` text() NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

나는 두 가지 방법을 고려하고 :

if (mysql_affected_rows() === 0) takeAction($name); 

장점 : 간단한 SQL, 테이블
CONS에 행을 추가 할 필요가 없습니다 :

if (mysql_affected_rows() === 2) takeAction($name); // Yes 2 for updates 

총 :

INSERT INTO filetable (name, parent_id, path_num, path_string) 
    VALUES ('$name','$pid','$path_num','$path_string') 
    ON DUPLICATE KEY UPDATE 0=0; 

및 PHP에서

: UPDATE가 작은 부분에 트리거 필드와 사용에 큰 테이블에

2.Creat 고유 인덱스를 눈을 얻을 수있는 더블 쿼리 name이 중복 된 경우 쿼리 수
CONS : 테이블의 추가 행

고유 한 필드는 path_string은 파일의 전체 경로입니다. 내 파일 시스템에서는 매우 길어질 수 있기 때문에 TEXT 유형의 필드를 사용할 수 있습니다. MySQL에서는 TEXT 필드에 고유 색인을 작성할 수 없습니다. 그래서 내가 생각하고있는 것은 컬럼을 만드는 것입니다.

`problemsolver` varchar(62) = $parent_id . '_'.$name 

그리고 크레타 고유 인덱스를 만드는 것입니다.

저는 이러한 쿼리가 데이터베이스에 대한 모든 쿼리의 10 %를 차지할 것으로 기대합니다.

제 질문은이 두 가지 방법 중 무엇을 사용 하시겠습니까? 그 이유는 무엇입니까? 또는 더 나은 옵션을 사용할 수 있습니까?

+0

UNIQUE 색인 s.t. 귀하의 INSERT는 단순히 실패하고 결과를 확인합니까? –

+0

고유 한 필드에 UNIQUE 키를 추가 한 다음 INSERT IGNORE를 사용하면 두 번째 INSERT ... ON DUPLICATE 필요 부분을 절약 할 수 있습니다. 어쨌든 어쨌든 잡는 중 오류를 찾고 있지는 않습니다 (쿼리를 다시하기 위해서가 아니라 적어도). 관련 내용 : http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update – DACrosby

답변

1

두 가지 방법 모두 사용할 수 있습니다. 당신의 질문은 매번 필요하지 않기 때문에 매번 쿼리가 집중적으로 수행되기 때문에 방법 1은 이상적이지 않습니다.

두 번째 방법은 필요할 때만 추가 작업을 수행하는 것이 더 효율적이므로 더 효율적입니다.

또한 충돌 값의 가능성을 줄이려면 저장된 값에 타임 스탬프 또는 임의의 임의의 데이터를 통합 할 수 있습니다.

관련 문제