1

多くのアイテムとその状態を常に追跡する必要があります。

ItemId Location  DateTime           State
   1   Mall A    2010-02-03 07:00   on_sale
   1   Mall A    2010-02-20 08:22   sold
   2   Warehouse 2010-02-02 09:00   on_sale
   2   Transit   2010-03-02 16:20   transit
   2   Mall B    2010-03-03 10:10   on_sale
   2   Mall B    2010-03-12 12:11   sold

現在、これは巨大なテーブルであり、MySQLの疑似ランク関数を使用してクエリを実行します。

ただし、非常に遅いです。特定のアイテムについては、フィルタリングを実行する前にランク= 1のアイテムを見つける必要があるため、クエリはインデックスを利用できません。

SELECT 
    item_sorted.*, IF(@prev <> item_sorted.item_id, @rownum := 1, @rownum := @rownum+1) AS rank,
    @prev := item_sorted.item_id
FROM ...

そのような機能を実装した経験は何ですか?あなたがお勧めするデータベース設計は何ですか?OracleやT-SQL対応のDBのようなデータベースは、パーティション化されたクエリをサポートしているため、はるかに優れていますか?

アイデアをよろしくお願いします!

4

1 に答える 1

0

質問から始めましょう:

このテーブルの主な目的は何ですか? そこにデータを挿入するには、またはそこからデータを取得するには?

2 つの可能性:

  • 挿入の場合:これを正規化することをお勧めします。多くの冗長性があります。
  • リトリーブ用:そのままでいいです。セットごとに代理キーをお勧めします。

時間の消費を比較したい場合は、PostgreSQL をインストールして結果を確認してください。Oracle や MS-SQL を使用する必要はありません。PostgreSQL で十分です。

私の推奨事項はデータのパーティション分割とは何の関係もないことは知っていますが、同様のテーブルを使用することで、これが私のやり方であり、うまく機能します。

お役に立てれば幸いです。

于 2010-12-09T15:25:12.363 に答える