2012-12-26 11 views
1

사용자가 필터를 정의하고 필터 기준과 일치하는 학생들의 게시물을 볼 수있는 대학용 응용 프로그램을 개발 중입니다.MYSQL : 후속 조인에 대한 쿼리 결과 저장

처음에는 MYSQL이 필터 매개 변수 (연도, 전공 등)와 일치하는 모든 학생 중 user_id을 찾기 위해 쿼리합니다. 그런 다음이 결과를 사용하여 JOIN을 통해 user_id에 연결된 해당 게시물/이벤트를 쿼리하고 찾을 수 있습니다.

질문 : s는 별도의 가입 쿼리에 대해 여러 번에 사용되는 동일한 user_id '(이벤트, 게시물 등) 내부에 MySQL의에 결과를 저장하는 것이 가능할 것이다 경우 궁금 해서요 이후

데이터를 사용하는 후속 JOIN 쿼리 속도를 높입니다.

거부 ​​됨 솔루션 :

  1. 를 사용하여 MySQL의 쿼리 캐시 - 쿼리마다 동일하지 않습니다으로 적용되지 않습니다; 초기 조인 순서는 동일하지만 각 조인에 다른 조인 매개 변수가 적용됩니다.
  2. API (php)로 데이터를 가져온 다음 where user_id = IN(#, #, #...)을 사용하여 쿼리를 보냅니다. MYSQL으로 다시 전송할 사용자 ID는 10,000 개가 될 수 있습니다. 쿼리가 너무 커서 JOIN 절감을 상쇄 할 수 있습니다.
+1

[CREATE TEMPORARY TABLE'] (http://dev.mysql.com/doc/refman/5.1/en/create-table.html)이 일반적으로 사용됩니다. – JimmyB

+1

임시 테이블을 최대 '선택'성능으로 인덱싱 할 수도 있습니다 (예 : [here] (http://stackoverflow.com/questions/3281852/pass-index-to-temporary-table-from-regular-table) 참조). – JimmyB

답변

1

존재하지 않는 성능 문제를 해결하지 마십시오. 즉, 먼저 다양한 쿼리를 시도하십시오. 응용 프로그램의 성능 기준을 충족하는 경우 다른 작업을 계속 수행하십시오. 사용자는 내부 루프에서 밀리 초를 누르는 것보다 더 많은 기능과 안정성에 더 관심이 있습니다.

즉 정상 프로세스는 임시 테이블입니다. 그러나 조인이 제대로 인덱싱되고 결과 집합이 작 으면 (즉, 전체 테이블 스캔을 수행하지 않는 경우) 성능 향상을 무시할 수 있습니다.

+0

나는 성과에 관하여 진심으로 동의합니다. 그러나 결과 집합은 5 개의 후속 쿼리에 사용됩니다. 임시 테이블이 내 노력에 가치가 있는지 확인하기 위해 프로파일 링하고 벤치 마크하고 싶습니다. 고맙습니다. – ProfileTwist

+0

성능에 위배되는 것은 없으며 성능을 위해 설계되었습니다. 쿼리 벤치 마크를 수행하십시오. 벤치마킹 할 때 쿼리를 여러 번 실행하도록 remmember하십시오. 첫 번째 실행은 캐시 성능으로 인해 후속 실행보다 느린 경우가 많습니다 (후속 쿼리가 첫 번째 실행보다 빠르게 실행되는 이유이기도 함). –

0

create or replace view database.foo_query_view as select id from students where [match-criteria]. 참고 : views are read-only. 그러나, 당신이 단지 선택을하고 싶어하는 것처럼 보이면, 괜찮을 것입니다.

+0

뷰는 해당 쿼리에 대해서만 적용됩니다. 결과 집합을 후속 쿼리 (전체 mysql 세션)를 위해 저장해야합니다. 임시 테이블이 이동하는 것처럼 보입니다. – ProfileTwist

+0

보기는 스냅 샷이며 실시간으로 업데이트되지 않습니다. – hd1