Rumah > Soal Jawab > teks badan
P粉0091864692023-09-04 14:58:45
terpantas
Tukar strim data untuk mengemas kini apabila panggilan masukcustomers.last_call
.
Kemas kini sambungan
UPDATE
与JOIN
相比,IN ( SELECT ... )
Kesannya lebih baik.
atau
OR
会降低性能。查询很可能会为每个客户扫描整个phone_call_log
.
Satu penyelesaian ialah melakukan dua UPDATE
, dan gunakan indeks yang sesuai:
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 ...
Ini memerlukan mencipta indeks berikut pada phone_call_log
:
INDEX(callee, start_time) INDEX(caller, start_time)
dan padam pemanggil indeks lajur tunggal semasa dan penerima.
Jenis data
Untuk nombor telefon, gunakan BIGINT
可能是错误的,特别是考虑到LENGTH(customers.phonenumber) > 6
.
Sebenarnya, semuanya berpunca daripada ujian mudah:
where customers.phonenumber is not null AND LENGTH(customers.phonenumber) > 6 AND customers.phonenumber > 1000000;
Setiap >
检查都会检查NOT NULL
; gunakan hanya satu daripadanya berdasarkan jenis data, dan indekskannya.
(Sila berikan SHOW CREATE TABLE
; 'Bahasa Inggeris' tidak cukup tepat.)
P粉3546029552023-09-04 10:38:38
Pertanyaan menggunakan OR
tidak boleh menggunakan indeks dengan cekap. Saya cadangkan anda mencuba perkara berikut:
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) )
Sila ambil perhatian bahawa GREATEST
mempunyai masalah mengendalikan nilai NULL.