Maison > Questions et réponses > le corps du texte
P粉0091864692023-09-04 14:58:45
le plus rapide
Modifiez le flux de données pour le mettre à jour lorsqu'un appel arrivecustomers.last_call
.
Mettre à jour la connexion
UPDATE
与JOIN
相比,IN ( SELECT ... )
L'effet est meilleur.
ou
OR
会降低性能。查询很可能会为每个客户扫描整个phone_call_log
.
Une solution consiste à en faire deux UPDATE
et à utiliser l'index approprié :
UPDATE SET customers.last_call = GREATEST( customers.last_call, ( select max(phone_call_log.start_time) FROM phone_call_log WHERE phone_call_log.callee = customers.phonenumber ) WHERE ... UPDATE SET customers.last_call = GREATEST( customers.last_call, ( ... caller ... ) ) WHERE ...
Cela nécessite de créer l'index suivant sur phone_call_log
:
INDEX(callee, start_time) INDEX(caller, start_time)
et supprimez l'appelant et l'appelé d'index à colonne unique actuels.
Type de données
Pour les numéros de téléphone, utilisez BIGINT
可能是错误的,特别是考虑到LENGTH(customers.phonenumber) > 6
.
En fait, tout se résume à un simple test :
where customers.phonenumber is not null AND LENGTH(customers.phonenumber) > 6 AND customers.phonenumber > 1000000;
Chacun >
检查都会检查NOT NULL
; utilisez-en un seul en fonction du type de données et indexez-le.
(Veuillez fournir SHOW CREATE TABLE
; « anglais » n'est pas assez précis.)
P粉3546029552023-09-04 10:38:38
Les requêtes utilisant OR
ne peuvent pas utiliser l'index efficacement. Je vous suggère d'essayer ce qui suit :
UPDATE customers SET last_call = GREATEST( (SELECT MAX(start_time) FROM phone_call_log WHERE callee = customers.phonenumber), (SELECT MAX(start_time) FROM phone_call_log WHERE caller = customers.phonenumber) )
Veuillez noter que GREATEST
a des problèmes pour gérer les valeurs NULL.