2014-02-21 2 views
0

두 개의 서버 (linode 3072 vps), 하나 (이전)에는 우분투 11.04 + MySQL 5.5.32가 있고 다른 하나 (최신)에는 centos 6.2가 있습니다. + MySQL 5.5.36. My.cnf 파일도 동일합니다. 그러나 동일한 db (똑바로 내보내기/가져 오기)에서 동일한 쿼리를 실행하면 2 개의 다른 응답 시간과 실행 경로가 2 개의 서버에서 발생합니다.MySql 같은 쿼리에 대한 다른 실행 경로

응답 속도가 빠른 이전 버전입니다.

1 SIMPLE ch ref PRIMARY,channel_name channel_name 122 const 1 Using where; Using temporary; Using filesort 
1 SIMPLE t ref PRIMARY,channel_id channel_id 4 bcc.ch.channel_id 1554  
1 SIMPLE p ref PRIMARY PRIMARY 4 bcc.t.entry_id 1 Using index 
1 SIMPLE c eq_ref PRIMARY,group_id PRIMARY 4 bcc.p.cat_id 1 Using where 

응답 속도가 느린 최신 버전.

1 SIMPLE ch ref PRIMARY,channel_name channel_name 122 const 1 Using where; Using temporary; Using filesort 
1 SIMPLE p index PRIMARY PRIMARY 8 NULL 25385 Using index; Using join buffer 
1 SIMPLE t eq_ref PRIMARY,channel_id PRIMARY 4 bcc.p.entry_id 1 Using where 
1 SIMPLE c eq_ref PRIMARY,group_id PRIMARY 4 bcc.p.cat_id 1 Using where 

큰 차이는 2 단계에있다. 첫 번째 서버는 인덱스를 사용하고 1554 개의 행만 스캔해야합니다. 두 번째 서버는 인덱스 + 조인 버퍼를 사용하고 25385 개의 행을 스캔해야합니다. 이견있는 사람?

이와 같은 검색어로 인해 특정 페이지의 새 서버에서 페이지 당 몇 초의로드가 증가합니다. 프론트 엔드에 바니시를 사용하고 있지만 여전히이 문제를 해결하고 싶습니다.

여기

select SQL_NO_CACHE cat_name,cat_url_title, count(p.entry_id) as count 
from exp_categories as c 
join exp_category_posts as p on c.cat_id = p.cat_id 
join exp_channel_titles as t on t.entry_id = p.entry_id 
join exp_channels as ch on ch.channel_id = t.channel_id 
where channel_name IN ('resources') 
AND group_id = 2 
group by cat_name 
order by count desc 
limit 5 
+0

쿼리를 게시하면 관련 테이블 정의도 도움이됩니다. 두 서버에서 문자 세트와 테이블 유형 (innodb, ...)이 동일합니까? –

+0

쿼리가 원래 게시물에 있고 유형 또는 MyISAM, UTF8 일반입니다. 쿼리가 4 개의 다른 테이블에 대한 것이므로 defs를 게시 할 수는 있지만 너무 길어서 물건을 어떻게 바꿀지 확신하지 못했습니다. 정확히 동일한 db이므로 (서버에서 db 내보내기를 실행했습니다. db import는 다른 것, 다른 것은 없다). 메신저 그냥 왜 같은 db + 쿼리에 2 가지 다른 실행 경로를 알아 내려고. – user814584

+1

죄송합니다. 나는 그것을 좀더 두드러지게 만들기 위해 질문을 편집했다. group_id가 exp_category_posts의 열입니까? 그렇다면 2 번째 옵티마이 저가이 열을 사용하여 빠르게 행 수를 줄일 수 있다고 생각합니다. 그 추측이 잘못된 경우 exp_category_posts 분석 표 (http://dev.mysql.com/doc/refman/5.0/en/analyze-table.html)가 사안을 변경하면 시도하십시오. –

답변

2

의 MySQL의 쿼리 최적화 프로그램은 인덱스와 테이블이 통계를 기반으로 사용하는 인덱스를 수정 해 실행되는 SQL입니다. 때로 인덱스의 선택이 최적이 아니며 쿼리 실행이 다릅니다.

우리 데이터베이스에서 같은 쿼리에 사용되는 실행 경로가 MySQL의 특정 시점에 변경되었음을 확인했습니다.

당신은

analyze table exp_categories,exp_category_posts,exp_channel_titles,exp_channels ; 

이 때때로 실행 계획을 향상을 시도 할 수 있습니다. 또는 인덱스 힌트를 사용하여 어떤 인덱스가 사용되는지 확인할 수 있습니다.

+0

이 효과가 있습니다. 이것은 내가 정기적으로/자동화해야 할 일인가요? 아니면 MySQL이 잘못 결정할 때마다이 문제를 처리해야합니까? 또한이 쿼리가 제공되는 CMS의 일부이므로이 특정 쿼리를 변경하기가 어려울 수 있습니다. – user814584

+0

데이터를 많이 변경하면 자동화 할 가치가 있습니다. 많은 수의 업데이트 후에 수행하는 것이 좋습니다. – noz

+0

방금 ​​데이터를 새 db로 가져온 이후로 원래 데이터베이스에서 분석을 실행 한 적이 없으므로 그 원인 일 수 있다는 것을 깨달았습니다. 문제가 없었습니다. – user814584