Mengapa kemas kini pertanyaan ini gagal dilaksanakan dengan jayanya?
P粉885562567
2023-09-03 16:39:14
<p>Saya mempunyai 2 meja, pelanggan (3000 baris) dan phone_call_log (350,000 baris). </p>
<p>Saya perlu melaksanakan masa panggilan terakhir kepada setiap pelanggan menggunakan log panggilan (lebih pantas untuk carian bahagian hadapan). </p>
<p>Indeksnya adalah seperti berikut:</p>
<ul>
<li>masa_mula (cap masa)</li>
<li>panggilan(bigint(32) tidak ditandatangani)</li>
<li>Pemanggil(bigint(32) tidak ditandatangani)</li>
<li>Nombor telefon (bigint(32) tidak ditandatangani)</li>
<li>last_call(timestamp)</li>
</ul>
<p>Apabila menjalankan pertanyaan ini, untuk lajur pemanggil/pemanggil, masa penyiapan adalah kurang daripada 2 saat tanpa pernyataan OR, tetapi dengan pernyataan OR, ia tidak akan selesai (dalam ujian, saya tidak membiarkannya berjalan selama lebih daripada 30 minit). </p>
<pre class="brush:sql;toolbar:false;">KEMASKINI pelanggan
SET pelanggan.last_call = (
PILIH maks(phone_call_log.start_time)
DARI phone_call_log
WHERE phone_call_log.callee = pelanggan.nombor telefon
ATAU phone_call_log.caller = pelanggan.nombor telefon
)
DI MANA pelanggan.nombor telefon BUKAN NULL
DAN panjang(pelanggan.nombor telefon) >
DAN pelanggan.nombor telefon >
</pra></p>
terpantas
Tukar strim data untuk mengemas kini apabila panggilan masuk
customers.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:Ini memerlukan mencipta indeks berikut pada
phone_call_log
: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:
Setiap
>
检查都会检查NOT NULL
; gunakan hanya satu daripadanya berdasarkan jenis data, dan indekskannya.(Sila berikan
SHOW CREATE TABLE
; 'Bahasa Inggeris' tidak cukup tepat.)Pertanyaan menggunakan
OR
tidak boleh menggunakan indeks dengan cekap. Saya cadangkan anda mencuba perkara berikut:Sila ambil perhatian bahawa
GREATEST
mempunyai masalah mengendalikan nilai NULL.