2010-02-16 5 views
1

나는 URL에 관한 다른 많은 세부 사항과 함께 테이블에 URL을 저장하는 데이터베이스를 가지고있다. 각 링크마다 검색을 수행하는 데 사용할 문자열을 저장하는 다른 테이블이 있습니다. 내 데이터베이스가 커질 것이고, 링크 테이블에 적어도 500 만 개 항목을 기대하고 있습니다.큰 데이터베이스 검색

사용자와 통신하는 응용 프로그램은 PHP로 작성됩니다. 모든 패턴 (n X m 검색)으로 모든 링크를 검색하는 방법과 동시에 서버에 높은로드를 유발하지 않고 속도를 잃지 않는 방법에 대한 제안이 필요합니다. 나는 그것이 고속이고 낮은 자원에서 작동하기를 원한다. 힌트, 의사 코드의 제안 사항이 있으면 모두 환영합니다.

지금은 이러한 검색을 수행하고 PHP의 도움을 받거나 PHP에서 완전히 수행하기 위해 SQL 명령을 사용할지 여부를 알지 못합니다.

답변

0

먼저 레이아웃을 다시 생각해 보시기 바랍니다. 모든 사용자에 대해이 쿼리를 실행하는 것이 약간 불필요한 것처럼 보이고 결과 테이블을 만드는 대신 패턴을 변경할 때마다 실행되는 쿼리의 결과를 삽입하십시오.

그렇지 않으면 필요한 필드에 색인 (전체 텍스트)이 설정되어 있는지 확인하십시오. 쿼리 자체를 들어 당신은 테이블을 조인 수 :

SELECT 
    yourFieldsHere 
FROM 
    theUrlTable AS tu 
JOIN 
    thePatternTable AS tp ON tu.link LIKE CONCAT('%', tp.pattern, '%'); 
0

난 당신이 꽤 확실히 그 SQL 코드가 아닌 PHP 코드를 수행 할 것을 말할 것입니다. 또한 URL의 문자열을 검색하는 것은 오랜 작업이므로 해싱의 일부 형식이 좋을 것입니다. 나는 누군가가 이전에 Zobrist 해시의 변형을 사용하는 것을 보았습니다 (Google은 결과를 다시 가져옵니다). 이 도움이

희망,

댄.

0

데이터베이스 내에서 최대한 많은 검색을 수행하십시오. nxm 결과 세트로 끝나고 적어도 500 만 건의 조회로 시작한다면, 결국 많은 데이터가 와이어 (또는 소켓, 그러나 당신은 데이터베이스에 연결하고 있습니다)를 거쳐 반복적으로 저주를 당하게됩니다 매번 가장 많이 던져 버린다. DB의 원시 검색 기능 (예 : '일치', '정규식', 전체 텍스트 등)이 작업에 적합하지 않더라도 원치 않는 행을 클라이언트 (사용자 코드)로 보내기 전에 유용하게 쓸 수 있습니다 .

0

DB에서 테이블을 최적화해야합니다. md5 해시를 사용하십시오. md5가있는 새로운 열은 색인과 더 빨리 발견 된 텍스트를 사용합니다.

그러나 LIKE '% text %'를 사용하면 도움이되지 않습니다.

스핑크스 또는 루신을 사용할 수 있습니다.