<p>고객(3000행)과phone_call_log(350,000행)라는 2개의 테이블이 있습니다. </p>
<p>통화 기록을 사용하여 각 고객의 마지막 통화 시간을 구현해야 합니다(프런트엔드 검색의 경우 더 빠름). </p>
<p>색인은 다음과 같습니다.</p>
- start_time(타임스탬프)
<li>call(bigint(32) unsigned)</li>
- 발신자(bigint(32) unsigned)
- 전화번호(bigint(32) unsigned)
<li>last_call(타임스탬프)</li>
</ul>
<p>이 쿼리를 실행할 때 호출자/호출 수신자 열의 경우 OR 문이 없으면 완료 시간이 2초 미만이지만 OR 문을 사용하면 완료되지 않습니다(테스트에서는 실행하지 않았습니다). 30분 이상). </p>
<pre class="brush:sql;toolbar:false;">고객 업데이트
SET 고객.last_call = (
최대 선택(phone_call_log.start_time)
전화_통화_로그에서
어디에서phone_call_log.callee = 고객.전화번호
또는phone_call_log.caller = 고객.전화번호
)
고객.전화번호가 NULL이 아닌 경우
AND 길이(고객.전화번호) > 6
그리고 고객.전화번호 > 1000000;
가장 빠르다
전화가 올 때 업데이트되도록 데이터 스트림을 변경하세요
customers.last_call
.연결 업데이트
UPDATE
与JOIN
相比,IN ( SELECT ... )
효과가 더 좋습니다.또는
OR
会降低性能。查询很可能会为每个客户扫描整个phone_call_log
.한 가지 해결 방법은 두 가지
으아악UPDATE
를 수행하고 적절한 색인을 사용하는 것입니다.이를 위해서는
으아악phone_call_log
에 다음 색인을 생성해야 합니다:및 현재 단일 열 인덱스 호출자와 호출 수신자를 삭제합니다.
데이터 유형
전화번호는
BIGINT
可能是错误的,特别是考虑到LENGTH(customers.phonenumber) > 6
를 사용하세요.사실 이 모든 것은 간단한 테스트로 요약됩니다:
으아악각
>
检查都会检查NOT NULL
; 데이터 유형에 따라 하나만 사용하고 색인을 생성하세요.(제공해 주세요
SHOW CREATE TABLE
; '영어'는 정확하지 않습니다.)OR
를 사용하는 쿼리는 색인을 효율적으로 사용할 수 없습니다. 다음을 시도해 보시기 바랍니다:GREATEST
에는 NULL 값을 처리하는 데 문제가 있습니다.