2010-05-03 4 views
18

약 10 만 명의 사용자를위한 표가 있습니다.MySQL보기 성능

첫 번째 케이스 :

Create or replace view vw_users as select state, count(*) as cnt from users 

Explain select cnt from vw_users where state = 'ca' 

것은 내가 계획을 설명 할 :

explain select state, count(*) as cnt from users where state = 'ca' 

나는 내가 5200

두 번째 경우로 비용을 얻을 수 위의 쿼리에 대한 계획을 설명 할 때 두 번째 쿼리에서 나는 비용을 100,000으로 얻는다.

뷰의 where 절은 어떻게 작동합니까? 뷰가 모든 행을 검색 한 후에 where 절이 적용됩니까? 이 문제를 어떻게 해결합니까?

+2

로보기 정의가 누락은 group by 절. –

+0

병합 알고리즘을 사용할 수없는 경우 도움이 되셨습니다. [유인보기의 성능 문제에 대한 해결 방법] (http://www.mysqlperformanceblog.com/2010/05/19/a-around- 성능에 대한 문제 - 유혹적인 전망 /) – landoncz

답변

28

view algorithm입니다.

병합 알고리즘은 물론 대부분의 테이블 인덱스와 이것 저것 작동 - TEMPTABLE 알고리즘은하지 않습니다 - 많은 경우에 인덱스 그냥 전혀 사용하지 플랫 아웃 될 것입니다.

그리고보기 다음 구조의 포함되어있는 경우 사용할 수 없습니다

병합을 지원하지 않습니다 병합 쓰레기가 많이있다 :

* Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth) 
* DISTINCT 
* GROUP BY 
* HAVING 
* LIMIT 
* UNION or UNION ALL 
* Subquery in the select list 
* Refers only to literal values (in this case, there is no underlying table) 
+0

피터, 입력 해 주셔서 감사합니다. 내 견해에있어 (*) 숫자가 있습니다. 그래서 병합을 사용할 수 없습니다. 지금은 알고리즘 유형을 지정하지 않았습니다. 그래서보기 대신 저장 프로 시저를 사용할 수있는 가장 좋은 방법은 무엇입니까? – vamsivanka

+0

네, 여기서 스토어드 프로 시저를 찾아야합니다 - 또는 단순한 서브 쿼리. –

+0

피터, 대단히 감사합니다. – vamsivanka