이 쿼리 업데이트가 성공적으로 실행되지 않는 이유는 무엇입니까?
P粉885562567
P粉885562567 2023-09-03 16:39:14
0
2
532
<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;

P粉885562567
P粉885562567

모든 응답(2)
P粉009186469

가장 빠르다

전화가 올 때 업데이트되도록 데이터 스트림을 변경하세요customers.last_call.

연결 업데이트

UPDATEJOIN相比,IN ( SELECT ... )효과가 더 좋습니다.

또는

OR会降低性能。查询很可能会为每个客户扫描整个phone_call_log.

한 가지 해결 방법은 두 가지 UPDATE를 수행하고 적절한 색인을 사용하는 것입니다.

으아악

이를 위해서는 phone_call_log에 다음 색인을 생성해야 합니다:

으아악

현재 단일 열 인덱스 호출자와 호출 수신자를 삭제합니다.

데이터 유형

전화번호는 BIGINT可能是错误的,特别是考虑到LENGTH(customers.phonenumber) > 6를 사용하세요.

사실 이 모든 것은 간단한 테스트로 요약됩니다:

으아악

>检查都会检查NOT NULL; 데이터 유형에 따라 하나만 사용하고 색인을 생성하세요.

(제공해 주세요SHOW CREATE TABLE; '영어'는 정확하지 않습니다.)

P粉354602955

OR를 사용하는 쿼리는 색인을 효율적으로 사용할 수 없습니다. 다음을 시도해 보시기 바랍니다:

으아악

GREATEST에는 NULL 값을 처리하는 데 문제가 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!