2010-07-21 3 views
1

끊임없이 변화하는 데이터를 마스터 테이블에 병합하는 여러 쿼리를 실행 중이며 아래 쿼리 중 하나가 매우 느리게 실행되는 것 같습니다.이것은 MySQL에서 무엇을하려고 최선의 쿼리입니까?

설정은 다음과 같습니다. products 테이블과 products_temp 테이블의 구조가 같습니다. 새 데이터가 products_temp 테이블로 이동 한 다음 아래의 쿼리와 유사한 쿼리를 실행하여 새 데이터를 마스터 products 테이블과 병합합니다. 이 테이블의

INSERT INTO products (name, brand, price, feeds_id, img_url, referral_url, productid, isbn, ean, upc) 
SELECT name, brand, price, feeds_id, img_url, referral_url, productid, isbn, ean, upc 
FROM products_temp 
WHERE feeds_id = 449 
AND productid NOT IN (
    SELECT productid 
    FROM products 
    WHERE feeds_id = 449 
) 

모두 feeds_id에 인덱스가 있지만 어떤 차이를 만드는되지 않은 느낌이있다.

예를 들어, products은 350 만 개가 넘는 행을 포함 할 수 있으며 products_tempproducts을 병합하기 위해 50,000을 포함 할 수 있습니다.

제 질문은 실제로 얼마나 오래 걸릴까요? 얼마나 빨리 만들 수 있습니까?

답변

-1

당신은 크게 (xxx 선택)에없는 x를 피해야합니다. mysql 질의 옵티 마이저는 서브 쿼리와 함께 매우 버그가 있으며 예를 들어 인덱스를 무시합니다.

0

색인을 feeds_id에 놓고 주 테이블의 고유 키 (feeds_id, productid)를 추가 할 수 있습니다. 따라서 INSERT IGNORE을 병합에 사용할 수 있습니다. 색인의 필드 순서에주의하십시오 - feeds_id이 먼저 와야하므로이 색인을 사용하여 feeds_id을 검색 할 수 있습니다.

NOT IN은 감속을 유발할 수 있습니다. 괄호 안의 내용에 따라 쿼리가 '준비 중'상태에 머물러있을 수 있습니다.

여전히 감속이 발생하면 EXPLAIN 또는 프로파일 링 기능을 사용하십시오.

0

또한
INSERT INTO products (name, brand, price, feeds_id, 
img_url, referral_url, productid, isbn, ean, upc) 
SELECT A.name, A.brand, A.price, 
A.feeds_id, A.img_url, A.referral_url, 
A.productid, A.isbn, A.ean, A.upc 
FROM 
(SELECT * FROM products_temp A WHERE feeds_id = 449) A 
LEFT JOIN 
(SELECT productid FROM products WHERE feeds_id = 449) B 
USING (productid) 
WHERE B.productid IS NULL; 

하는이 인덱스를 가지고 있는지 확인 오른쪽에 NULL 검사 JOIN 쿼리를 리팩토링 시도하고 LEFT로 설정

ALTER TABLE products_temp ADD INDEX feeds_id (feeds_id);