대학 웹 사이트 용 응용 프로그램을 개발 중이며 모든 이벤트를 데이터베이스에서 오름차순으로 가져 오려고합니다. 네 개의 테이블 중 한 곳입니다 :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는 조인 된 테이블에 적용됩니다.
도움이나 도움을 주시면 감사하겠습니다. 감사합니다. 해피 홀리데이!
조인과 where 절을 해결하려면 쿼리에 이벤트 날짜와 이벤트 ID가 모두 필요합니다. 인덱스를 (date, eventid)의 복합 인덱스로 변경하고 쿼리 계획에 어떤 영향이 있는지보십시오. –