2014-07-15 6 views
0

나는이 쿼리를 실행하려면 :여러 조인을 올바르게 수행하는 방법은 무엇입니까? MySQL의

SELECT * FROM business 
INNER JOIN permissions 
     AS status1 ON (business.status1 = permission.permission AND permissionType ="status1") 
INNER JOIN permissions 
     AS status2 ON (business.status2 = permission.permission AND permissionType= "status2") 

통보 : 내가 복수 할 같은 테이블 사이에 조인!

이 쿼리는 오류없이 실행되지만 속도는 매우 느립니? 그것을 향상시키는 방법?

+3

테이블에 적절한 색인을 추가하십시오. –

+0

SQL 쿼리 앞에'EXPLAIN'을 넣고 다시 실행하면 출력을 게시물에 넣어서 테이블을 최적화 할 수 있습니다. – scragar

+0

db 구조체 란 무엇입니까? – throrin19

답변

1

위르겐은 올바른 생각을 가지고 있습니다. 너는 색인에 테이블에 적당한 란을 원할 것이다. 귀하의 경우, 나는 business.status1 및 business.status2뿐만 아니라 permissions.permissionType을 색인화합니다. 인덱스에는 여러 종류가 있으므로, 찾고있는 것이 무엇인지 연구해야합니다.

또한 SELECT *이 있습니다. 이렇게하면 비즈니스 테이블의 모든 열, 권한 테이블의 모든 열 및 권한 테이블의 모든 열이 다시 선택됩니다. 이것은 아마도 전혀 필요하지 않기 때문에 조금 좁히는 것이 좋습니다. 그 아무것도 도움이 될 경우에 나는 아무 생각이 없지만, 일반적으로, 나는 내 제한 조인 유지하려면

SELECT * FROM business 
INNER JOIN permissions 
    AS status1 ON (business.status1 = permission.permission) 
INNER JOIN permissions 
    AS status2 ON (business.status2 = permission.permission) 
WHERE status1.permissionType = "status1" 
    AND status2.permissionType = "status2" 

:

그냥 여분의 생각으로, 당신은 또한 조금 쿼리의 구조를 변화시킬 수 연결의 단일 지점으로.

실제 명령 구문과 관련하여 올바르게 조인을 수행하고 있습니다. 이 시점에서 그것은 단지 속도의 문제 일 뿐이며 적절한 색인을 권하는 문제를 해결합니다.

+0

귀하의 답변에 감사드립니다! 하지만 난 진술과 함께 status1.permissionType = "status1"을 썼다. 맞습니까? – user3648409

+0

@ user3648409 예, 여전히 맞습니다. 나는 개인적으로'ON' 절에 오직 하나의 진술만을 원하지만, 여러 진술을하는 것은 완벽하게 합법적이다. –

+0

@RussellUhl이 쿼리는 MySQL과 완전히 동일합니다. 내부 조인의 on 절과 where 절의 유일한 구별이 나타납니다. 귀하의 솔루션은 더 빨리 될 수 없습니다. 올바른 해결책은 데이터를 표준화하고 올바른 색인을 만드는 것입니다. – scragar

관련 문제