여러 테이블을 조인하는 큰 쿼리 (MYSQL)가 있습니다.
SELECT * FROM
`AuthLogTable`,
`AppTable`,
`Company`,
`LicenseUserTable`,
`LicenseTable`,
`LicenseUserPool`,
`PoolTable`
WHERE
`LicenseUserPool`.`UserID`=`LicenseUserTable`.`UserID` and
`LicenseUserTable`.`License`=`LicenseTable`.`License` and
LEFT(RIGHT(`AuthLogTable`.`User`, 17), 16)=`LicenseUserPool`.`UserID` and
`LicenseUserPool`.`PoolID`=`PoolTable`.`id` and
`Company`.`id`=`LicenseTable`.`CompanyID` and
`AuthLogTable`.`License` = `LicenseTable`.`License` and
`AppTable`.`AppID` = `AuthLogTable`.`AppID` AND
`PoolTable`.`id` IN (-1,1,2,4,15,16,17,5,18,19,43,20,3,6,8,10,29,30,7,11,12,24,25,26,27,28,21,23,22,31,32,33,34,35,36,37,38,39,40,41,42,-1)
ORDER BY
`AuthLogTable`.`AuthDate` DESC,
`AuthLogTable`.`AuthTime` DESC
LIMIT 0,20
나는 Explain을 사용 하고 다음을 제공합니다.
이것을 더 빨리 만드는 방법? 큰 테이블에서는 몇 초가 걸립니다.
" 0-19 행 표시 (총 20 개, 쿼리에 3.5825 초 소요 )"
내가 아는 한 쿼리에 사용 된 필드는 각 테이블에 색인이 생성됩니다.
AuthLogTable에 대한 인덱스가 설정 됨
데이터에 대해 'order by'절없이이 쿼리를 실행하여 차이가 있는지 확인할 수 있습니다 ( 'explain'도 실행). 그렇다면 정렬 기준이되는 필드에 인덱스 / 인덱스를 추가하는 것을 고려할 수 있습니다. Using temporary; using filesort;
시간이 걸리는 인덱스없이 임시 테이블이 생성 된 다음 정렬됨을 의미합니다.
내가 아는 한 조인 스타일은 쿼리가 어쨌든 다른 형식으로 구문 분석되기 때문에 아무런 차이가 없습니다. 그러나 여전히 ANSI 조인 구문을 사용하고 싶을 수 있습니다 (이 질문 ANSI 조인 대 "where 절"조인 참조 ).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다