Heim > Fragen und Antworten > Hauptteil
P粉0091864692023-09-04 14:58:45
最快
当有电话呼入时,改变数据流以更新customers.last_call
。
更新连接
UPDATE
与JOIN
相比,IN ( SELECT ... )
效果更好。
或者
OR
会降低性能。查询很可能会为每个客户扫描整个phone_call_log
。
一种解决方法是进行两个UPDATE
,并使用适当的索引:
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 ...
这需要在phone_call_log
上创建以下索引:
INDEX(callee, start_time) INDEX(caller, start_time)
并且删除当前的单列索引caller和callee。
数据类型
对于电话号码来说,使用BIGINT
可能是错误的,特别是考虑到LENGTH(customers.phonenumber) > 6
。
实际上,所有这些都可以归结为一个简单的测试:
where customers.phonenumber is not null AND LENGTH(customers.phonenumber) > 6 AND customers.phonenumber > 1000000;
每个>
检查都会检查NOT NULL
;根据数据类型只使用其中一个,并对其进行索引。
(请提供SHOW CREATE TABLE
;'英文'不够准确。)
P粉3546029552023-09-04 10:38:38
使用OR
的查询无法有效地使用索引。我建议你尝试以下方法:
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) )
请注意,GREATEST
在处理NULL值时存在问题。