テーブル「ttraces」には、さまざまなタスクの多くのレコードがあります(値は「taskid」列に保持され、テーブル「ttasks」の列「id」の外部キーです)。各タスクは 8 ~ 10 秒ごとに「ttraces」にレコードを挿入するため、パフォーマンスを向上させるためにデータをキャッシュすることはお勧めできません。必要なのは、「ttraces」から各タスクの最新のレコードのみを選択することです。つまり、列「time」の最大値を持つレコードを意味します。現在、テーブルには 500000 を超えるレコードがあります。これら 2 つのテーブルの構造を非常に単純化すると、次のようになります。
-----------------------
| ttasks |
-----------------------
| id | name | blocked |
-----------------------
---------------------
| ttraces |
---------------------
| id | taskid | time |
---------------------
そして、私のクエリを以下に示します。
SELECT t.name,tr.time
FROM
ttraces tr
JOIN
ttasks t ON tr.itask = t.id
JOIN (
SELECT taskid, MAX(time) AS max_time
FROM ttraces
GROUP BY itask
) x ON tr.taskid = x.taskid AND tr.time = x.max_time
WHERE t.blocked
WHERE 句と JOIN 句で使用されるすべての列にインデックスが付けられます。今のところ、クエリは約 1.5 秒間実行されます。その速度を上げることは非常に重要です。すべての提案に感謝します。ところで: データベースはホストされた共有サーバーで実行されており、今のところ他の場所に移動することはできません。
[編集] EXPLAIN SELECT...結果は次のとおりです。
--------------------------------------------------------------------------------------------------------------
id select_type table type possible_keys key key_len ref rows Extra
--------------------------------------------------------------------------------------------------------------
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 74
1 PRIMARY t eq_ref PRIMARY PRIMARY 4 x.taskid 1 Using where
1 PRIMARY tr ref taskid,time time 9 x.max_time 1 Using where
2 DERIVED ttraces index NULL itask 5 NULL 570853
--------------------------------------------------------------------------------------------------------------
エンジンは InnoDB です。