Rumah > Soal Jawab > teks badan
P粉7104789902023-09-01 21:08:35
Hmm, mungkin anda boleh cuba menambah indeks pada jadual anda: https://www.drupal.org/docs/7/guidelines-for-sql/the-benefits-of-indexing-large-mysql-tables#: ~ :text=Mencipta%20Indeks&teks=%20penyata%20kepada%20buat%20indeks,%20indeks%20mesti%20berbeza. Pastikan anda menambah indeks komposit berdasarkan baris yang anda tanya.
Jika ini tidak menambah baik masa pertanyaan anda, maka pertanyaan itu harus diperbaiki.
P粉0200855992023-09-01 14:23:17
Nota:
CONCAT-LEAST-GREATEST - Adakah ini untuk membina "friends_id"? Mungkin apa yang anda mahukan sebenarnya ialah "id_perbualan"? Pada masa ini, dua pengguna tidak boleh mempunyai berbilang "perbualan", bukan?
Buat lajur baharu untuk conversation_id jika anda benar-benar memerlukannya. (Pada masa ini, GROUP BY tidak cekap.) Kod berikut menghapuskan keperluan untuk id sedemikian.
( SELECT lastid FROM ( ( SELECT from_id, MAX(id) AS lastid FROM messages WHERE to_id = ? GROUP BY from_id ) UNION DISTINCT ( SELECT to_id, MAX(id) AS lastid FROM messages WHERE from_id = ? GROUP BY to_id ) ) AS x ) AS conversations
Dan miliki indeks "penutup" dan "komposit" ini:
INDEX(to_id, from_id, id) INDEX(from_id, to_id, id)
Mengalih keluar KEY(to_id), KEY(from_id) kerana indeks baharu saya boleh mengendalikan semua tugas lain bagi kedua-dua indeks ini.
Saya rasa ini mempunyai kesan yang sama tetapi berjalan lebih cepat.
Gabungkan mereka:
SELECT * FROM ( ( SELECT from_id AS other_id, MAX(id) AS lastid FROM messages WHERE to_id = ? GROUP BY from_id ) UNION ALL ( SELECT to_id AS other_id, MAX(id) AS lastid FROM messages WHERE from_id = ? GROUP BY to_id ) ) AS latest JOIN messages ON messages.id = latest.lastid ORDER BY messages.id DESC
(Tambahkan dua indeks ini)
Lagi
Saya pernah tersilap sangka bahawa UNION DISTINCT boleh menggantikan keperluan untuk conversation_id. tetapi ia bukanlah kebenaran. Saya segera melihat beberapa penyelesaian: