문제

뷰를 사용하는 쿼리가 있는데, 이들은 모든 관련 테이블이 인덱스되어 있다고 기대하는 것보다 훨씬 느리게 실행됩니다 (어쨌든 크지는 않습니다).

나는 이것을 설명 할 수 있기를 바랍니다.

내 메인 쿼리는 다음과 같습니다 (심하게 단순화)

select [stuff] from orders as ord 
left join calc_order_status as ors on (ors.order_id = ord.id)

calc_order_status 다음과 같이 정의 된 견해입니다.

create view calc_order_status as
select ord.id AS order_id,
(sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
from orders ord 
left join order_items itm on itm.order_id = ord.id
group by ord.id

명령 (ord)에는 명령이 포함되어 있으며 order_items 각 주문 및 가격과 관련된 개별 품목을 포함합니다.

모든 테이블이 올바르게 인덱싱되지만 일은 천천히 실행되며 설명 할 때 나는 얻을 수 있습니다.

  # id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
  1 1 PRIMARY ord ALL customer_id NULL NULL NULL 1002 Using temporary; Using filesort 
  2 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1002   
  3 1 PRIMARY cus eq_ref PRIMARY PRIMARY 4 db135147_2.ord.customer_id 1 Using where 
  4 2 DERIVED ord ALL NULL NULL NULL NULL 1002 Using temporary; Using filesort 
  5 2 DERIVED itm ref order_id order_id 4 db135147_2.ord.id 2   

내 생각에, "devived2"는 견해를 나타냅니다. 개별 항목 (ITM)은 주문 _ id로 색인 된 정상으로 작동하는 것 같습니다. 문제는 # 4 라인 인 것으로 보이며 시스템이 Orders Table (ORD)의 키를 사용하지 않음을 나타냅니다. 그러나 기본 쿼리에서 주문 ID는 이미 정의되어 있습니다. 왼쪽 join comc_order_status on ors on (orsorord _ id = ord.id) 및 ord.id (기본 쿼리 및보기 내) 기본 키를 나타냅니다. .

MySQL Simpliy보다 어딘가에서 읽은 것은 잘 최적화되지 않으며 가능한 경우에도 일부 조건에서 키를 사용하지 않을 수있는 뷰를 최적화하지 않습니다. 이것은 그러한 사례 중 하나 인 것 같습니다.

어떤 제안도 감사하겠습니다. MySQL이 "생각보다 간단하고 기본 키를 사용하면 괜찮을 것"을 깨닫도록 강요하는 방법이 있습니까? 아니면 견해가 이것에 대해 전혀 잘못된 방법입니까?

도움이 되었습니까?

해결책

결합을 제거하는 것이 가능하다면 그것들을 제거하십시오. 하위 쿼리로 교체하면 속도가 빠릅니다.

속도 차이가 있는지 확인하기 위해 이와 같은 것을 실행하려고 시도 할 수도 있습니다.

select [stuff] from orders as ord 
left join (
  create view calc_order_status as
  select ord.id AS order_id,
  (sum(itm.items * itm.item_price) + ord.delivery_cost) AS total_total
  from orders ord 
  left join order_items itm on itm.order_id = ord.id
  group by ord.id
) as ors on (ors.order_id = ord.id) 

다른 팁

인덱스는 큰 테이블에서 몇 행을 찾는 데 유용하지만 모든 행을 쿼리하면 색인이 속도가 느려집니다. 따라서 MySQL은 아마도 전체 [Order] 테이블을 사용하고 있기 때문에 인덱스를 사용하지 않는 것이 좋습니다.

더 빠를 경우 시도 할 수 있습니다 강제 MySQL 인덱스 사용 :

from orders as ord force index for join (yourindex)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top