2013-07-31 3 views
0

있는 테이블에 합류 아래 내 쿼리속도까지 MySQL의 업데이트를 LIKE

UPDATE cdata AS gcd 
LEFT JOIN tar AS ap 
ON gcd.dialled 
LIKE CONCAT(ap.prefix, '%') 
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination 
WHERE gcd.prefix=0; 

이 타임 아웃을 보인다는 그 일을하는 LIKE 경우 궁금하다. cdata에는 약 140000 개의 레코드와 약 25000 개의 tar에 대한 검색 기능이 있습니다. 따라서 MySQL은 140000 개의 레코드 각각에 대해 25000 개의 조회를 수행하고 있습니까?

가능하면 속도를 높이는 방법을 찾아야합니다.

도움을 주셔서 감사합니다.

+0

gcd.dialled에 대한 색인이 있습니까? – fthiella

+0

MySql이 쿼리를 실행하는 방법을 설명하도록 요청할 수 있습니다. http://dev.mysql.com/doc/refman/5.0/en/explain.html을 참조하십시오. – dash

+0

예 다이얼링 된 접두사에 인덱스가 있습니다. – jhodgson4

답변

0

이 방법은 잘못되었습니다. 한정되지 않은 데이터에 대해 UPDATE 쿼리를 사용하지 마십시오.

+0

그래서 어떤 접근 방식을 취해야합니까? – jhodgson4

1

이것은 해킹 비트입니다. UNION을 사용하면 더 좋은 방법일까요?

UPDATE cdata AS gcd 
JOIN tar AS ap 
ON substring(gcd.dialled, 1, 3) = ap.prefix 
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination 
WHERE gcd.prefix=0 
; 
-- ... 
UPDATE cdata AS gcd 
JOIN tar AS ap 
ON substring(gcd.dialled, 1, 9) = ap.prefix 
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination 
WHERE gcd.prefix=0 
; 

실행 모든 쿼리를하고 적절한 시간에 모든 데이터를 업데이트해야합니다 : 7 개 쿼리 수 ap.prefix의 각 길이 1로 휴식. (참고 : 이전에 0이었던 행에 NULL을 넣지 않으려면 LEFT JOIN 대신 JOIN으로 전환했습니다.

+0

그게 재미 있어요, 고마워요! PHP에서이 쿼리를 하나의 쿼리로 실행할 수 있습니까? – jhodgson4

+0

이것은 완벽하게 작동하고 초 만에 완성되었습니다! 도와 줘서 고마워! – jhodgson4

+0

@ jhodgson4 나는'UNION' 버전을 관리했습니다. 그러나 그것은 느리고 아주 못생긴 것입니다. 나는'IN' 문과'OR' 문을 시도했지만 어떤 이유로 든 최적화를 수행하지 못했습니다 (너무 느려서 실행되지 않았습니다). –