2011-01-23 2 views
0

나는 2 테이블에 왼쪽 조인 성명 : tbl1 약 1 백만 레코드가 있고 tbl2 약 2 천만있다. 쿼리는 약 9 초 정도 걸립니다. 나는 둘 다에 인덱스를 가지고 있지만, 쿼리가 얼마나 오랫동안 지속되는지를 고려해 볼 때 무언가가 옳지 않은 것처럼 보입니다. 여기 내 선택 성명 :어떻게 든 내 데이터베이스 또는 쿼리 속도를 향상시킬 필요가

EXPLAIN SELECT * FROM (SELECT tbl1.id, tbl1.name, tbl2.addr FROM tbl1 LEFT JOIN tbl2 ON tbl2.id = tbl1.id WHERE tbl1.name LIKE 'G%' AND tble2.addr IS NOT NULL) as tempTable GROUP BY id LIMIT 10; 

+----+-------------+------------+--------+------------------+--------------+---------+----------------| 
id|select_type| table  |type |poss_keys|key |key_len|ref   | rows | Extra 
+----+-------------+------------+--------+------------------+--------------+---------+---------------- 
1 | PRIMARY | <derived2>|system| NULL |NULL| NULL |NULL  | 0 | const row not found | 
2 | DERIVED | tbl1  |range |id,name |name| 903 |NULL  | 1 | Using where   | 
2 | DERIVED | tbl2  |ref |id,addr |id | 4  |tbl2.tbl1.id| 25 | Using where   | 
+----+-------------+------------+--------+------------------+--------------+---------+---------------- 

업데이트 : 나는 밖으로 가지고가는 경우에 는 & 단지 선택 기록 TBL1 또는 선택 문이 빠르다 (물론 1 초 이하)하지만 가입 할 때 개별적으로 TBL2에서 문을 가입 그들은 그때 그것을 onsiderably 느려 ... 나는 그들을 정확하게 합류하거나 내가 조인에 대한 특별한 색인의 일종 필요합니까? 인덱스가 작동하지 않을 때

+1

1. 중첩 쿼리가 필요한 이유는 무엇입니까? 2. 왜 LEFT JOIN을 사용합니까? 3. 테이블 구조는 어디에 있습니까? – zerkms

+0

왼쪽 결합은 내 2 개의 테이블을 조인하는 데 사용됩니다. 나는 임시 테이블이 필요 없다고 생각하지만, 쿼리를 수정할 때 쿼리는 여전히 오랜 시간이 걸릴 것입니다. –

답변

1

당신은 ... 나는 당신이 임시 테이블이나 그룹을 필요가 있다고 생각하지 않습니다 ... 그것 또한

SELECT tbl1.id, tbl1.name, tbl2.addr 
FROM tbl1 LEFT JOIN tbl2 ON tbl2.id = tbl1.id 
WHERE tbl1.name LIKE 'G%' AND tble2.addr IS NOT NULL 

조금 단순화 할 수 당신은 오

mysql_unbuffered_query 

사용해보십시오 많은 다른 방법

당신은 시도 할 수

+0

그는 'LEFT JOIN' +'tble2.addr IS NOT NULL '도 필요하지 않습니다. – zerkms

+0

왜 'LEFT JOIN'과 'tble2.addr IS NOT NULL'이 필요 없는지 설명 할 수 있습니까? – arnaud576875

+0

thx하지만 제안의 결과를 비슷한 속도로 변경하면 명령문이 문제의 근원으로 보이지 않습니다. –

0

" 'G %의'같은 tble2.id"를 추가 할 수 있습니다 N PHP 쪽은 더 이상 복용 카운트가 그런

을 필요로한다 (10)로 한계를 지정한대로 빨리 나는 결과가 10 결과

를 포함으로 생각하게 것이다
SQL_SMALL_RESULT 

당신은 SQL_SMALL_RESULT 옵션, MySQL을 사용하는 경우 메모리 임시 테이블을 사용합니다. 그래서 작은 결과 쿼리가 더 빠릅니다.

+0

thx. 나는 PHP를 사용하고 있지만 "mysqli_stmt_execute ($ q)"형식의 내 문장을 사용하여 버퍼없는 쿼리를 사용하는 방법을 잘 모르겠다 ... SQL_SMALL_RESULT에 관해서는 버전 3.23 이상 –

+0

mysql_unbuffered_query ($ query); mysql_query ($ query)와 같다. – Harish

관련 문제