特定のエンティティのステータス/メッセージ更新のページを作成しようとしています。ユーザーは任意の数のエンティティをサブスクライブでき、このページで最新の情報を取得できます。私の現在のクエリは、実行に時間がかかります (1.3+ 秒、200K 行のテスト テーブルで)。これは、50 行程度を取得するだけです。
スキーマは次のとおりです。
実在物:
entity_id, message, timestamp
ユーザー
user_id
サブスクリプション
user_id, entity_id
クエリは次のとおりです。
SELECT entity.*
FROM entity
INNER JOIN subscription ON subscription.entity_id = entity.entity_id
WHERE subscription.user_id = 1
ORDER BY entity.timetamp DESC
LIMIT 50
データベース側の問題は次のようです。
Copying to tmp table 0.033285
converting HEAP to MyISAM 0.031850
Copying to tmp table on disk 1.177973
Sorting result 0.064075
サブスクリプション テーブルで、次の説明情報を取得します。一時的な使用; ファイルソートの使用
InnoDB テーブルを使用しており、entity_id、user_id、および timestamp 列にインデックスがあります
更新: order by が原因であるか、問題であると思われます。タイムスタンプ列にインデックスがあるので、それ以外に、最新のメッセージをより迅速に取得するために他に何ができますか?
更新: order by 句を削除すると、クエリがすばやく実行されます。0.0006 秒対 1.3。そのため、最初にサブクエリを介してデータを取得してから order by を実行しようとしましたが、これは何もしません。
使用したクエリは次のとおりです。
SELECT tbl.* FROM (
SELECT entity.*
FROM entity
INNER JOIN subscription ON subscription.entity_id = entity.entity_id
WHERE subscription.user_id = 1
) as tbl
ORDER BY tbl.timetamp DESC