2011-09-07 4 views
1

유명인 사진 웹 사이트를 구축했습니다. 10 만 장의 사진을 찍은 후, 내 아마추어 기술이 나타나기 시작했고, 곧 연마해야합니다. 몇 가지 간단한 검색어가 반환하는 데 5-10 초가 걸립니다.MySQL 전체 텍스트 검색 및 조인

"사진"테이블 (캡션 및 제목), "사람"테이블, "키워드"테이블 및 "photoContributor"테이블을 검색하는 텍스트 상자 검색 기능이 있습니다. "사람"과 "키워드"에 대한 두 개의 관계형/연관성 테이블이 "photoPeople"및 "photoKeyword"라고합니다. 어쩌면

한 가지 가능한 사용자 검색 : "브래드 피트 안젤리나 졸리 선글라스 @MG"-이 함께 브래드와 안젤리나가 포함 된 모든 사진을 반환해야합니다, 어디 선글라스는 볼과 기여자 @MG에 의해 수행 될 수있다.

"LIKE"절을 "%"접두어로 사용하고 있기 때문에 "사진"테이블의 "캡션"및 "헤드 라인"필드에 INDEX를 사용할 수 없다는 것을 알게되었습니다. 필드는 "LONGTEXT"데이터 유형으로 설정됩니다. 이러한 필드에 인덱스가 없으므로 반환 시간이 많이 걸립니다. 따라서 "FULLTEXT"검색을 사용해야한다고 생각하고 현재 캡션 및 헤드 라인 필드를 VARCHAR (2000)로 설정할 수 있습니다. 가장 큰 캡션은 1991 자이며 여전히 "INDEX" 기능을 사용하면 속도가 빨라집니다. 나는 또한 검색에서 단어를 제거하는 부울 함수를 좋아한다.

내가이 질문을 쓰는 이유는 "JOINS"에서 완전히 쓸모가 없다는 것입니다. 아마도 하나의 테이블에 "FULLTEXT"쿼리를 작성할 수 있으며 아마도 왼쪽 또는 오른쪽 조인을 사용하여 두 테이블을 함께 결합 할 수 있습니다 ... 그러나 연관성/관계형 테이블이 중간에 있기 때문에 정말 혼란 스럽습니다.

누군가가 조인과 전체 텍스트를 사용하고 관계형 테이블을 사용하여 예제 쿼리를 보여 주거나, 사용하는 조인 (있는 경우) 및 전체 텍스트에 대한 팁을 설명해 주시면 감사하겠습니다. 나는 데이터베이스 구조에있다.

아래는 내 기본 데이터베이스 스키마입니다 :

 
photos (tbl) 
photoID    INT(11)   Primary  Auto-Increment 
headline   Long-Text 
caption    Long-Text 
dateCreated   DateTime 

people (tbl) 
peopleID   INT(11)   Primary  Auto-Increment 
people    VarChar(255) 

photoPeople (tbl) 
photoID    INT(11) 
peopleID   INT(11) 

keywords (tbl) 
keywordID   INT(11)   Primary  Auto-Increment 
keyword    VarChar(255) 

photoKeyword (tbl) 
photoID    INT(11) 
keywordID   INT(11) 

photoContributor (tbl) 
photoID    INT(11) 
contributorRef  VarChar(100) 

검색이 이루어지면, 조회되는 테이블/필드는 다음과 같습니다 photos.headline, photos.caption, keywords.keyword, people.people는, photoContributor.contributorRef.

누군가가 나를 도울 수 있기를 바랍니다. 긴급한 쿼리.

+0

전체 텍스트 색인은 MyISAM 테이블에서만 작동합니다. 그들은 InnoDB에서 지원되지 않았습니다. (그리고 앞으로 나아갈 길은 아마 없을 것입니다.) –

+0

내 테이블이 MyISAM 엔진을 사용하고 있습니다. 내 원인이 .. 도움이됩니까? – TheCarver

답변

2

MyISAM 엔진과 InnoDB 엔진에서만 지원되는 전체 텍스트 검색과 외래 키 조건 (조인에 유용함)은 MySQL에 대한 번거 로움입니다.

전체 텍스트 검색을 수행하려면 MyIsam 엔진에 테이블이 있어야합니다. 나는 그다지 많은 경험을하지 못한다. 그래서 나는 당신에게 많은 도움을 줄 수 없다.

당신이 추측 한 것처럼 시간 싱크는 % 접두사와 같이 사용하고 있기 때문에 반환하기 전에 데이터베이스의 모든 항목을 살펴 봐야합니다.

조인을 사용하려면 데이터베이스를 폴링하기 전에 쿼리 문자열을 분할해야하지만 상당히 쉽습니다. 조인에 대한 훌륭한 소개는 W3school 자습서에서 찾을 수 있습니다.난 당신이로 실행 볼 수 있습니다 http://www.w3schools.com/sql/default.asp

가장 큰 문제는 이것이다 : 당신이 가득 할 질수 있기 때문에 당신이 당신의 데이터베이스에 구현 조인 일부는 괜찮은 얻을 관리하더라도 , 당신은 여전히 ​​(조인 된 테이블에 같이 사용해야합니다 InnoDB에서 텍스트 검색). 이 때문에 멋진 조인은 쿼리 속도를 크게 향상시키지 않습니다.

내 조언은 다음과 같습니다. 검색 필드를 추가하십시오. 이렇게하면 조인을 통해 좋은 결과를 얻을 수 있습니다. 좋아요를 사용하지 않으려면 이름을 성, 중간 성으로 나눕니다.

텍스트 필드 검색을 실제로 유지하려는 경우 기고자의 접두사를 사용하는 것처럼 데이터를 입력하는 방법에 대한 규칙을 지정해야 할 수도 있습니다 (따라서 배후에서 분할하고 검색 할 수 있습니다). .

죄송합니다. 죄송합니다. 이보다 더 정확하고 도움이 될 수는 없지만 귀하가 제시하는 내용은 빠른 수정 문제가 아닌 것 같습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 이 문제는 완료하는 데 시간이 걸릴 것이라는 점에 동의합니다. – TheCarver

+0

방금 ​​확인했고 내 테이블은 MyISAM 엔진을 사용하고 있습니다. 사용자가 여러 개의 텍스트 상자를 사용할 수있는 고급 검색 페이지가 있지만 모든 사용자가 빠른 검색 상자를 사용하는 것처럼 보이는데, 그러므로 새로운 질의가 필요합니다. – TheCarver

+0

또한 'LIKE'를 사용하는 캡션 및 헤드 라인 필드 일뿐입니다. 키워드, 사용자 및 참여자 입력란은 모두 정확히 일치해야합니다. WHERE keyword = 'Sunglasses' – TheCarver