2012-08-16 5 views
1

나는 웹 크롤러를 가지고 있습니다. 웹 크롤러는 내가 제공 한 웹 페이지에서 링크를 수집하지만 링크를 검색 할 때 일부 링크는 웹 사이트 때문에 복제됩니다. 새 행이 이전 행과 완전히 동일하면 MYSQL에 데이터 덮어 쓰기 방법이 있습니까?mysql 테이블 데이터 덮어 쓰기

내가 링크 필드

나 또한 다시 http://www.facebook.com을 데리러 관리에 http://www.facebook.com이있는 경우, 내가 이전 행을 덮어 후자를하고 싶은 말. 그러므로 나는 검색 엔진에 충돌이 없다.

+0

[도움이 되십니까?] (http://stackoverflow.com/questions/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql) –

답변

1

은 기본적으로 당신의 삽입 명령문을 작성하면 고유 키와 우려 열을 만든 다음

ON DUPLICATE KEY UPDATE col = overwriting value 
2

내가 원하는 있으리라 믿고있어 추가 ON DUPLICATE KEY 행동

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

조사 url이 이미있는 경우 last_updated 날짜를 업데이트하십시오. 그렇지 않으면 업데이트 할 좋은 이유가 없습니다.

INSERT INTO `scrapping_table` 
    (`url`) 
    VALUES 
    ("www.facebook.com") 
    ON DUPLICATE KEY UPDATE 
    `date_updated` = `datetime.now()` 
+0

나는 'pages'테이블을 가지고 있는데, 조금 더 설명 할 수 있겠는가? –

+0

'pages' 테이블에'facebook.com'을 저장하는'url' 컬럼이 있습니다. 이제 웹을 다시 크롤링하고 크롤러가 다시 'facebook.com'을 찾습니다. 'url'을 업데이트하는 것은 현재 당신이이 업데이트를 수행 한'date'를 저장함으로써이 새로운 크롤링에 대한 더 많은 메타 정보를 저장할 수 없다면 중복되는 단계입니다. –

+0

Google과 같은 대형 시스템의 경우 크롤링에 몇 주가 소요될 수 있으며 '이 URL을 본 마지막 정보'정보를 저장하면 검색 알고리즘에 유용하므로 크롤러가 동일한 URL을 계속 사용하지 않게됩니다. 약간 다른 점에서, Google은 전체 텍스트 검색을 구축하기위한 좋은 전략 인'거꾸로 된 인덱스 (inverted indices) '를 사용합니다. –

0

당신이 그냥 링크 필드는 고유하며 당신이 당신의 열에서 더 독특한 필드가있는 경우, 나는이 두 번째 방법으로 인해를 사용하는 것이 좋습니다 있는지 확인

INSERT INTO "mytable" (link_field, x_column, y_column) VALUES ("www.facebook.com",'something new for x','something new for y') 
ON DUPLICATE KEY UPDATE x_column='something new for x', y_column='something new for y' 

을 사용할 수있는 것보다 당신의 링크 필드는 고유 경우 they은 여러 개의 고유 인덱스가있는 테이블에서 ON DUPLICATE KEY 절을 사용하지 않는 것이 좋습니다.

  1. 링크 필드를 고유 한 것으로 설정하십시오.
  2. 행이

    Select "primary_id" from mytable where link_field="www.facebook.com" 
    
  3. 이 SQL에서 반환 된 행의 수를 계산하려고 삽입하기 전에.

    => 만약 카운트> 0 카운트 == 0, 당신의 행을 삽입하는 경우 우리는 단지 SELECT SQL

    =>를 움켜 잡았다은 "primary_id"를 사용하여 행을 업데이트

0

주의!

아마 쿼리의 각 "기어"프로세스 불을 최소화하려는 링크의 수백만을 찾을 웹 크롤러를 운영하면서 ... 당신이 로봇을 공급하는 고유 한 링크 테이블을 생성 하시겠습니까? 또는 중복 된 검색 결과를 방지 하시겠습니까?

고유 한 URL 풀 테이블 : - (!와 in_array())

  • 동안 페이지를 크롤링 당신은 배열 (또는 목록)에 URL을 저장해야하고 확인하는 것을 그 고유 한 값의 배열, 크롤링하는 각 페이지에는 반복되는 링크가 많이 포함되어 있으므로 SQL을 사용하기 전에 정리하십시오.
  • 비밀 번호를 해시로 변환 ("simhash"는 32 자리 [1,0]).
  • 이제 db에 대한 연결을 열어 덤프하면 존재하는지 확인하십시오! (두 번째 프로세스를 만드는) 업데이트하지 마십시오. 당신은 훨씬 더 빨라질 것입니다 색인 된 테이블을 통해 해시를 사용하여 링크를 일치해야합니다. 위의 방법에 URL을 색인 경우

    • 것은 당신이있는 경우에, 그것은 당신의 크롤링 작업에 문제가 의미, 중복 된 URL의를 찾을해야합니다

    중복 결과 검색을 방지 .

  • 다른 테이블에 값이 중복되어 있어도 검색하려고하지만 중복 결과를 반환하지 않을 경우 쿼리에 DISTINCT를 사용할 수 있습니다.

행운을 빕니다!