0

現在、テーブルを追加専用モデルに移動して、SELECTのmemcachedフロントエンドを使用して、UPDATEとDELETEを回避することで書き込みパフォーマンスを向上させています。

すべての行には、MAX(timestamp)を使用して選択された最新の行でタイムスタンプが付けられます。これはうまく機能しますが、時間が経つとテーブルは古い無関係なデータでいっぱいになりますが、簡単なものを書くことができます

DELETE FROM table WHERE timestamp < XXXX 

ただし、これにより、過去XX時間以内に更新されなかった可能性のある行が削除されるため、古い行だけでなく、そのIDがテーブルから完全に削除されます。

示す非常に単純なスキーマとデータの例を以下に示します。

---------------------------
| id        |   INT       |
| name      |   VARCHAR   |
| timestamp |   TIMESTAMP |
---------------------------

初期データ

-------------------------------------------
| id        |   name       |  timestamp   |
-------------------------------------------
| 1         |   Trevor     |            1 |
| 2         |   Mike       |            1 |
-------------------------------------------

ユーザー名が更新された場合、行は更新されずにユーザーの新しい名前で追加されます。

-------------------------------------------
| id        |   name       |  timestamp   |
-------------------------------------------
| 1         |   Trevor     |            1 |
| 2         |   Mike       |            1 |
| 1         |   Trev       |           60 |
-------------------------------------------

単純なDELETEクエリを使用して60秒より古い行を削除すると(実際の場合は1時間または1日程度)、意図したとおりに行1のTrevorが削除されますが、Mikeの唯一のレコードも削除されます。

-------------------------------------------
| id        |   name       |  timestamp   |
-------------------------------------------
| 1         |   Trev       |           60 |
-------------------------------------------

XXより古い個別のID行のみを削除する必要があるため、Mikeが名前を更新しておらず、タイムスタンプがXXより古い場合でも、両方のユーザーが残ります。

-------------------------------------------
| id        |   name       |  timestamp   |
-------------------------------------------
| 2         |   Mike       |            1 |
| 1         |   Trev       |           60 |
-------------------------------------------

各IDを調べて最新のタイムスタンプを取得し、そのタイムスタンプより古いすべての行を削除することもできますが、テーブルのユーザー数が増えると、このプロセスにかかる時間が長くなります。

上記のように、できれば1つまたは2つのクエリでテーブルをクリーンアップできるSQLクエリはありますか?

ありがとう

4

1 に答える 1

1

私はMySQLの専門家ではありませんが、このクエリでうまくいくはずです。

DELETE t1 FROM
  table1 AS t1, table1 AS t2
WHERE 
  t1.id = t2.id
AND 
  t1.timestamp < t2.timestamp;

これらの60分をt1.timestampに追加すると、60分より古い行のみが削除されます。

SQLフィドル

于 2013-02-26T20:43:07.113 に答える