うーん、テーブルにインデックスを追加してみてはいかがでしょうか: https://www.drupal.org/docs/7/guidelines-for-sql/the-benefits-of-indexing-large-mysql -tables#:~:text=インデックスの作成&text=インデックスを作成するステートメント。インデックスは個(gè)別である必要があります。 クエリを?qū)g行する行に基づいて複合インデックスを追加してください。
これによってクエリ時(shí)間が改善されない場(chǎng)合は、クエリを改善する必要があります。
###知らせ:###
OR の代わりに UNION を使用します (以下を參照)
必要に応じて、conversation_id の新しい列を作成します。 (現(xiàn)時(shí)點(diǎn)では、GROUP BY は非効率的です。) 次のコードにより、そのような ID が不要になります。
リーリーそして、これらの「カバー」インデックスと「複合」インデックスを用意します:
リーリー新しいインデックスでこれら 2 つのインデックスの他のすべてのタスクを処理できるため、KEY(to_id)、KEY(from_id) を削除します。
これは同じ効果があると思いますが、実行速度が速くなります。
それらを組み合わせる:
リーリー(これら 2 つのインデックスを追加します)
######もっと######私はかつて、conversation_id の必要性を UNION DISTINCT で置き換えることができると誤って考えていました。しかしそれは真実ではありません。すぐにいくつかの解決策が見(jiàn)つかりました:
conversation_id を追加し、重複排除に使用します。 (また、UNION DISTINCT を UNION ALL に変更して、結(jié)果を変えることなくクエリをわずかに高速化しました。)
(from_id、to_id、latestid) を含む一時(shí)テーブルにクエリ結(jié)果を入力し、CONCAT-LEAST-GREATEST テクニックを使用して會(huì)話を重複排除し、最後にメッセージ テーブルと JOIN して追加の列を取得します。この一時(shí)テーブル テクノロジにより、書(shū)き込みとデバッグが容易になります。私の 3 番目の提案は、これらの部分を 3 レベルの深さでネストされた Select ステートメントを含む 1 つの (判読できない) クエリに結(jié)合することです。