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