2015-01-12 2 views
0

값이 내림차순으로 정렬 된 카테고리의 제품을 출력하는 아주 간단한 MySQL 쿼리가 있습니다.인덱스를 사용하기 위해 mysql 내부 조인 쿼리를 최적화하십시오.

SELECT 
    p.id_product, p.price 
FROM product p 
INNER JOIN product_category pc 
ON (pc.id_product = p.id_product AND pc.id_category=1234) 
GROUP BY pc.id_product 
ORDER BY p.price DESC 

내가 "PRODUCT_CATEGORY"테이블에서 "제품"테이블에서 제품을 많이보다 제품 카테고리 관계를 가지고 있기 때문에이 쿼리는 영원히 지속됩니다. 내가 정의 인덱스/기본 키 다음 한

:

  • 테이블 "제품"- 기본 키 (id_product)
  • 테이블 "PRODUCT_CATEGORY"- 기본 키 (id_product, id_category), 지수 (id_product) 지수 (id_category)

하지만이 쿼리를 설명 할 때 얻을 :

+----+-------------+-------+--------+--------------------+------------+---------+------------------------+-------+----------------------------------------------+ 
| id | select_type | table | type | possible_keys  | key  | key_len | ref     | rows | Extra          | 
+----+-------------+-------+--------+--------------------+------------+---------+------------------------+-------+----------------------------------------------+ 
| 1 | SIMPLE  | pc | index | PRIMARY,id_product | id_product | 4  | NULL     | 73779 | Using index; Using temporary; Using filesort | 
| 1 | SIMPLE  | p  | eq_ref | PRIMARY   | PRIMARY | 4  | mydb.pc.id_product  |  1 |            | 
+----+-------------+-------+--------+--------------------+------------+---------+------------------------+-------+----------------------------------------------+ 

그래서 ... 일시적인 사용; filesort 사용하기 - 모든 것이 너무 느리게 실행되는 이유는 이것이 문제라고 생각합니다.

이 쿼리는 닫힌 소스 소프트웨어에서 여러 번 실행되므로 변경할 수 없습니다. 그러나이 쿼리가 더 빨리 실행될 수 있도록 테이블/인덱스를 최적화하고 싶습니다. 어떤 도움을 주셔서 감사합니다.

+0

GROUP BY 절을 제거하십시오. 내가 말했듯이 – Strawberry

+0

- 폐쇄 소스 소프트웨어에서 기원 한 것이므로 쿼리를 변경할 수 없습니다. 그래서 나를위한 유일한 해결책은 테이블을 최적화하는 것입니다. – j99

답변

0

id_category에 상수 조건이 있고 id_product에 JOIN 조건이 있습니다.

이 순서대로 (id_category, id_product)에 색인을 생성하면 MySQL은 범주 1234에 대한 관련 색인 항목을 찾고 두 테이블에서 가져 오는 관련 product_id을 찾을 수 있습니다.

불행히도 나는 이것을 시험 할 수 없습니다. 나중에 시도해 볼 수 있습니다. 시도해 볼 수 있다면 매우 빨리 알게 될 것입니다 ...