2017-02-09 7 views
0

예를 들어, 방문자 (봇 등)를 감지 할 수있는 데이터베이스가 있고 모든 방문자가 '자격증 명'과 동일한 양의 '동적 테이블'을 가지고있는 것은 아닙니다. 참조 : fiddle : http://sqlfiddle.com/#!9/ca4c8/1 (단순화 된 버전).MySQL 자체 조인 성능 : 사실 또는 잘못된 색인 생성?

이렇게하면 (다른 DB에있는) 각 프로필에 대한 정보를 수집하는 데 사용하는 프로필 ID가 반환됩니다. 프로필 유형에 따라 다른 name 절 (name = 'something') (ei : hostname, ipAddr, userAgent, HumanId 등)을 사용하여 테이블을 쿼리합니다.

나는 SQL 전문가가 아니에요하지만 난이 검색 결과에서 본 것을 나는 인덱스, 제약, 차, 고유, 외래 키 등으로 그리고에서 잘 알고 :

그들 대부분은 조인 자체에 나쁜 성능에 대한 의견하지만 인덱스를 원인을 누락 을 위해 이동하는 경향이답이있다.

그래서 마지막 질문은 테이블 자체 조인은 모든 것이 적절히 색인되어 있다고 가정하면 나쁜 성능을 내기 쉽습니다. 보조 노트에


는 테이블에 대한 자세한 정보는 : 질문에 관련성이없는하지만 내 특정 상황에 대한 맥락에서 잘 수 있습니다

  • 열 플래그로 삭제 기록을 표시하는 데 사용됩니다 PHP에서 사용하는 사용자에게는이 데이터베이스에 대한 DELETE 권한이 없습니다. 죄송합니다. 보안이 성능보다 중요합니다.
  • 사용자 에이전트에서 얻은 정보와 함께 사용할 '유형'을 추가했습니다. (즉, 어떤 것이든지 봇이라면 적어도 5000 형만 검색 할 것입니다.
  • 'name'열은 불행히도 기본 키 (프로필 및 유형 포함)에 색인되어 있습니다.
  • 나는 많은 INT와 필터링 (WHERE)을 사용하여 결과의 ​​궁극적 인 손실을 줄이기 위해 SELECT 쿼리에서 시도했다. (심지어 문제가있는 경우)
  • 높은 배경을 가진 사람이 필요하지 않으면 연구하고 조정할 의향이있다. mysql은 정말 좋은 일이 아니라는 것을 알려줍니다.

이것은 내가 개발 한 커다란 프로젝트로, 수백만 개의 레코드로 테스트 할 수는 없지만, 필자는 performan 이것이 성장함에 따라 문제가 될 것입니다. 모든 입력, 링크, 참조, 문서 또는 시험 절차 (어쩌면 의견에 있음)는 높이 평가됩니다.

답변

1

자체 조인은 두 개의 다른 테이블 조인과 다를 바 없습니다. 옵티마이 저는 일반적으로 WHERE을 기반으로 하나의 '테이블'을 선택한 다음 다른 루프로 중첩 루프 조인을 수행합니다. 귀하의 경우에는 LEFT을 통해 단 한 가지 방법 만 사용해야 함을 암시했습니다. (옵티마이 저가 을 무시하면이 필요하지 않습니다.

키는 피들을 찾고 있습니다.

"Entity-Attribute-Value"는 테이블에 데이터를 배치하는 지저분한 방법입니다. 귀하의 검색어는 특정 속성 쌍 (이름 = Googlebot AND 주소 = ...)이있는 profile (엔티티)을 찾습니다.

매우 쉽고 빠를 것입니다. 두 개의 열 (이름과 ADDR)과 "복합"INDEX(name, addr).

난 다음, JSON 문자열을 하나의 컬럼에 나머지를 넣어. here를 참조하십시오 "속성"를 일반적인을 위해 그 일을하는 것이 좋습니다

.

을 가지고
+0

설명서에 대한 감사, 당신이 찾고 있던 입력의 종류. 내가 2 개의 칼럼을 사용하지 않은 이유는 다른 유형의 프로파일이 필요하다는 것입니다. 속성의 양. (ei : apis에는 name, addr, appid, token이 4 개 필요합니다). –

+0

"자체 조인은 두 개의 다른 테이블 조인과 다르지 않습니다." 똑바로 앞으로 답변을하고 귀하의 프로필을보고 나는 이걸로 충고를 느낀 것처럼 보인다. –