2014-12-14 7 views
1

내가이 네 개의 테이블을 가지고 말 :MySQL은 - 매김 여러 열을 주문하는 방법을 효율적으로

BRANCH (BRANCH_ID, CITY_ID, OWNER_ID, SPECIALTY_ID, INAUGURATION_DATE) 
CITY (CITY_ID, NAME) 
OWNER (ONWER_ID, NAME) 
SPECIALTY (SPECIALTY_ID, NAME) 

내가 50 (LIMIT X, 50)의 페이지 매김을 사용하여 모든 지점이 표시됩니다 어디 PrimeFaces가 DataTable을 가지고있다. 오늘 BRANCH에는 10000 개의 행이 있습니다. 나는 그들의 이름을 보여주고 싶기 때문에 BRANCH을 다른 3 개의 테이블과 결합시킬 것이다.

나는 다음과 같은 기본 종류로 결과를 가져하려는 : 이제

ORDER BY INAUGURATION_DATE ASC, C.NAME ASC, O.NAME ASC, S.NAME ASC

, 사용자는 내 데이터 테이블에서이 컬럼의 헤더를 클릭하도록 선택할 수 있습니다, 그리고 나는를 쿼리합니다 데이터베이스에서 우선 순위를 물어 보았다. 그는 내림차순, 전문 이름으로 처음 주문 선택한 경우 예를 들어, 내가 할 수있는 것들 :

이제

ORDER BY S.NAME DESC, INAUGURATION_DATE ASC, C.NAME ASC, O.NAME ASC

내 질문 : 난 항상 4 열을 사용하여이 동적 종류로 데이터베이스를 조회 할 수있는 방법, 효율적으로? 많은 사용자가 동시에 (1000 명의 사용자와 같이) 내 사이트에서이 데이터 테이블을 볼 수 있으므로 ORDER BY을 SQL에 사용하면 은 매우 느림입니다. Java에서 순서를 수행하고 있지만 올바르게 페이지 매김을 수행 할 수 없습니다. SQL에서 어떻게 효율적으로 만들 수 있습니까? 이 열에 대한 색인을 충분히 만드나요?

감사합니다.

답변

0

10000 행이 매우 작기 때문에 mysql이 매우 빠르게 처리 할 수 ​​있어야합니다. 도시, 소유자 및 특수 클래스 (기본 키를 선언 할 경우에 해당)에 적절한 색인이 있다고 가정하면이 쿼리는 신속하게 반환되어야합니다. 또한 검색어에 LIMIT 50을 사용해야합니다. 그러나 행 수가 많아지면 (예 : 백만 또는 그 이상) 쿼리 속도를 줄이기 위해 쿼리 시간을 조정해야합니다. 그런 다음 City_ID, Owner_ID, Speciality_id 또는 inauguration_date의 개별 인덱스가 도움이되지 않습니다. 정렬을 이용하려면 결합을 수행 중이며 where 절이 없다고 가정하면 색인은 정렬하려는 모든 열에 있어야합니다. 따라서 모든 경우를 다루기 위해 꽤 많은 인덱스가 필요할 것입니다. 성능이 문제가되는 경우 응용 프로그램에 모든 옵션이 필요한지 여부를 고려할 수 있습니다. 아마도 사용자에게 하나의 열만 정렬하도록 제안 할 수 있습니다. 이 경우 개별 색인이 도움이됩니다. 또한 행 수가 많아지면 성능 병목 현상이 정렬되지 않고 페이지 매김을 수행하는 방식이됩니다. 나는 접근 방식이 https://stackoverflow.com/a/19609938/4350148 인 것을 좋아한다.

마지막으로 한 점. MySQL은 기본적으로 쿼리를 캐시합니다. 따라서 테이블이 변경되지 않으면 정렬을 수행 할 필요없이 쿼리가 반환됩니다.

관련 문제