2011-10-07 4 views
3

가입 상대적으로 적은 수의 행을 감안할 때 믿을 수 없을 정도로 느린 것처럼 보이는 결과를 내게 돌려 주라. 내가 여기서 뭔가 잘못하고있는거야?MySQL의 성능 저하는 내가 내가 다음 쿼리를 실행할 때 함께 조인 테이블의 몇 가지있다 쿼리

나는 내가 다음을 얻을 쿼리에 EXPLAIN 실행하는 경우 :

select_type table type possible_keys key key_len ref rows extra 
===================================================================================== 
simple   article all null   null null  null 762  using temporary; using filesort 
simple   authors all null   null null  null 5061 using where; using join buffer 

두 테이블이 InnoDB에 있습니다. 나는 상당히 낮은 사양 (Windows XP, 1GHz, 1GB RAM) 인 로컬 컴퓨터에서이 프로그램을 실행하고 있지만 그렇다고하더라도이 프로그램이 더 빠를 것이라고 생각했을 것입니다. 테이블에 몇 개의 행을 추가하면 초 단위가 아닌 분 단위로 시작됩니다.

의견이 있으십니까? 아래

표 구조 :

Article: 

field type  null key default extra 
======================================================= 
id  int  yes   null 
year  char(20) yes   null 
volume char(20) yes   null 
issue char(20) yes   null 
title text  yes   null 

Authors: 

field  type  null key default extra 
======================================================= 
id   int  yes   null 
last_name char(100) yes   null 
initials char(10) yes   null 
+0

당신이'authors.last_name'에 인덱스를 가지고 있습니까? 조인에 사용되는 열에 대한 인덱스가 있습니까? 'authors.last_name'에 색인이 있습니까? 인덱스가 전혀없는 경우 테이블 크기가 커지면 느려지고 느려집니다. –

+0

yout 테이블 구조도 게시하십시오. (나는'authors.last_name'과'article.year'을 의미했습니다.) –

+0

아니요, 현재 쿼리에 사용중인 열에 대한 인덱스가 없습니다. 좋은 지적입니다. 이 단계에서 다루기에는 꽤 작은 테이블처럼 보였으므로 추가하지는 않았지만, 영향을받는 열에 인덱스를 추가하고 아무 것도 해결하는지 살펴 보겠습니다. – DrNoFruit

답변

2

봅니다 열 authors.last_nameauthors.id에 인덱스를 추가.

하지만 검색어가 맞습니까? 그래서, articles.author_id에 인덱스가 요구 될 경우

SELECT article.year, authors.last_name, count(DISTINCT article.id) as count FROM 
article LEFT JOIN authors ON article.author_id = authors.id WHERE authors.last_name = 
'bloggs' GROUP BY article.year 

-하지만,없는이 쿼리에 대한,하지만 튜더 말했듯이 일반적인 모범 사례로

+1

@Tudor가 언급했듯이,'author (id)'에'FOREIGN KEY '가 될'article.author_id' 필드가 필요합니다. 또한 어떤 필드가 (두 테이블 모두에서)'PRIMARY KEY '인지 선언 할 필요가 있으며,'WHERE' 또는'ON'에서 사용되는 더 많은 필드를 추가로 인덱스합니다. –

+0

감사합니다. 연극을하고 결과를 알려 드리겠습니다. – DrNoFruit

+1

관련 칼럼에 인덱스를 추가했음을 모두 알게 해 주었고 큰 차이를 만들었습니다. 감사합니다.처음에는 그것을하지 않은 것에 대해 약간 어리석은 느낌이 들었습니다. 나는 그런 작은 테이블에서 그렇게 중요하지 않다고 생각했습니다. – DrNoFruit

0

, 인덱스를 추가 : 그것은 같이해서는 안된다. 그룹을 추출 할 수도 있습니다.

SELECT * FROM (SELECT article.year, authors.last_name, count(DISTINCT article.id) as count FROM 
article LEFT JOIN authors ON article.author_id = authors.id WHERE authors.last_name = 
'bloggs') GROUP BY article.year 

이렇게하면 먼저 조인에서 페치하고 집합에서 집계 함수를 적용합니다.

그리고 explain은 개선점이 어디 있는지 확인합니다. 제안의

글꼴 :

http://kccoder.com/mysql/join-group-by-performance/

+0

왜이 변경이 도움이 될 것이라고 생각하십니까? –

+0

링크의 예제는 단 하나의 테이블과 서브 쿼리 내부에있는'GROUP BY'와 외부 쿼리의'JOIN'을 가지고 있습니다. 당신은 그 반대였습니다. –

관련 문제