2012-12-26 3 views
2

대학 웹 사이트 용 응용 프로그램을 개발 중이며 모든 이벤트를 데이터베이스에서 오름차순으로 가져 오려고합니다. 네 개의 테이블 중 한 곳입니다 :MYSQL : 테이블 정렬 방식으로 주문 최적화

표 Events1는

event_id, mediumint(8), Unsigned 
date,  date,     

Index -> Primary Key (event_id) 
Index -> (date) 

표 events_users

event_id, smallint(5), Unsigned 
user_id, mediumint(8), Unsigned 

Index -> PRIMARY (event_id, user_id) 

표 user_bm

link, varchar(26) 
user_id, mediumint(8) 

Index -> PRIMARY (link, user_id) 

표 user_eoc

link, varchar(8) 
user_id, mediumint(8) 

Index -> Primary (link, user_id) 

검색어 :

EXPLAIN SELECT * FROM events1 E INNER JOIN event_users EU ON E.event_id = EU.event_id 
RIGHT JOIN user_eoc EOC ON EU.user_id = EOC.user_id 
INNER JOIN user_bm BM ON EOC.user_id = BM.user_id 
WHERE E.date >= '2013-01-01' AND E.date <= '2013-01-31' 
    AND EOC.link = "E690" 
    AND BM.link like "1.1%" 
ORDER BY E.date 

설명 :

쿼리는 위의 두 가지 작업을 수행합니다.

1) user_bm 및 user_eoc 테이블을 통해 모든 학생을 검색하고 필터링합니다. "link"열은 정규화되지 않은 열로 학생들을 주요/연도/캠퍼스별로 빠르게 필터링합니다.

2) 필터를 적용하면 MYSQL은 일치하는 모든 학생의 user_ids를 가져 와서 참석중인 모든 이벤트를 찾아서 출력합니다. 오름차순.

쿼리 최적화 프로그램은 EXPLAIN :

id select_type  table type  possible_keys  key  key_len  ref rows Extra 
1 SIMPLE EOC  ref  PRIMARY  PRIMARY  26 const 47 Using where; Using index; Using temporary; Using f... 
1 SIMPLE BM ref  PRIMARY,user_id-link user_id-link 3 test.EOC.user_id 1 Using where; Using index 
1 SIMPLE EU ref  PRIMARY,user_id  user_id  3 test.EOC.user_id 1 Using index 
1 SIMPLE E eq_ref PRIMARY,date-event_id PRIMARY  3 test.EU.event_id 1 Using where 

질문 :

쿼리가 잘 작동하지만, 최적화 할 수 있습니다. 특히 - filesort를 사용하고 임시 사용하는 것은 값 비싸고 나는 이것을 피하고 싶습니다. 일치하는 사용자와 1 : n 관계가있는 날짜별로 'Order By'이벤트를 원하기 때문에 이것이 가능한지 확실하지 않습니다. Order BY는 조인 된 테이블에 적용됩니다.

도움이나 도움을 주시면 감사하겠습니다. 감사합니다. 해피 홀리데이!

+0

조인과 where 절을 해결하려면 쿼리에 이벤트 날짜와 이벤트 ID가 모두 필요합니다. 인덱스를 (date, eventid)의 복합 인덱스로 변경하고 쿼리 계획에 어떤 영향이 있는지보십시오. –

답변

0

두 가지 방법으로 주문할 수 있습니다. 색인 또는 임시 테이블. Events1 테이블에서 날짜순으로 정렬하지만 날짜가 포함되지 않은 PRIMARY KEY를 사용하고 있으므로이 경우 임시 테이블에서 결과를 정렬해야합니다.

반드시 비싸지는 않습니다. 결과가 메모리에 들어가기에 충분할만큼 작 으면 디스크의 임시 테이블이 아니라 메모리에 임시 테이블이되므로 비싸지 않습니다.

filesort도 아닙니다. "filesort 사용"은 파일을 사용하지 않는다는 것을 의미하며 인덱스별로 정렬하지 않는다는 의미입니다.

쿼리가 빠르게 실행되면 만족해야합니다. 결과 세트가 작 으면 메모리에서 정렬되고 파일이 작성되지 않습니다.