2012-12-08 2 views
2

와 MySQL을보기를 최적화 나는이보기가 :이 쿼리를 실행집계 함수

CREATE VIEW invoicereport 
SELECT i.ID, SUM(o.Amount * o.Price) AS Total 
FROM invoice i 
JOIN `order` o ON i.ID = o.InvoiceID 
GROUP BY i.ID 

을 직접 0.03 초 정도 걸립니다. 그러나보기를 실행하는 데 2 ​​초가 걸립니다. SELECT * FROM invoicereport WHERE ID=9000 일 때도 2 초가 걸립니다. 내가 SELECT * FROM invoicereport WHERE ID=9000을 수행 할 때 다음 그것은 훨씬 더 느린 완료 3 초 정도 걸립니다

CREATE VIEW invoicereport 
SELECT i.ID, (SELECT SUM(Amount * Price) FROM `order` WHERE InvoiceID=i.ID) AS Total 
FROM invoice i 

가 하위 쿼리 만 ID 9000 에 대해 실행됩니다 생각 :

그래서 나는에보기를 다시.

이 쿼리를 최적화하는 다른 방법이 있습니까?

+2

[MySQL은 성능 말썽 꾸러기로 VIEW] (http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/) –

답변

0

이 테이블을 추가 할 필요가 없다고 생각하면 그룹화 order이면 충분합니다. (제 의견). 이와 같이 :

CREATE VIEW INVOICEREPORT 
SELECT O.INVOICEID as ID, SUM(O.AMOUNT * O.PRICE) AS TOTAL 
FROM `ORDER` O 
GROUP BY O.INVOICEID 

그런 다음 다른 사람과이보기를 결합 할 수 있습니다. 그리고 order에 색인을 사용하십시오.

+0

표 송장은 고객과 같은 다른 정보를 포함 이름 등의 전화 번호는 다음과 같이 시도 – mumu

+0

: 는'송장에서 i.customer_name, i.tel, ir.total 을 i.id 선택 내가했다 ir.id = i.id' –

+0

에 invoicereport의 IR에 가입 2 초, 첫 번째 코드와 거의 같습니다. – mumu

0

나는 Kuya John의 의견에 동의합니다. 그러한 단순한 요약에서, 그것을보기 위해 노력하는 것을 괴롭히지 마십시오. 결합의 단순성은 불필요합니다. 누군가가 기존의 견해를 사용하고 있고 그의 질의가 다소 외설적 인 시간이었을 때 몇 년 전 유사한 대답을 한 다른 대답이있었습니다. 쿼리의 원시 테이블로 돌아가서 직접 작성하라는 요청을 받았을 때 쿼리는 여전히 매우 간단하고 매우 빠릅니다. 보기를 사용하지 마십시오. 직접 select 문과 같이 사용하십시오.

하위 선택과 같은 조회는 일반적으로 검색어 시간 킬러이며 항상 둘 다 피하려고합니다.

다른 인보이스 데이터도 찾고 있으므로 문제는 없어야하지만 ... 큰 확인 ... 주문 테이블에 인보이스 ID의 색인이 있습니까?

SELECT 
     I.ID, 
     I.Customer_Name, 
     I.Tel, 
     SUM(o.Amount * o.Price) AS Total 
    FROM 
     invoice I 
     JOIN `order` o ON I.ID = O.InvoiceID 
    WHERE 
     I.ID = 9000 
    GROUP BY 
     I.ID 
+0

InvoiceID는 색인입니다. 실제 쿼리는 이것보다 훨씬 복잡합니다. AS OrderCount, SUM (IF (mg.Type = 'Food', 1,0)) AS FoodCount, SUM (IF (mg.Type = 'Drink', 1,0)) AS DrinkCount 등. 그리고 '주문'은'menugroup'과 합쳐진'menu'와 합류했습니다. – mumu