私は利用可能な製品に関心を示すことができる電子商取引のWebサイトに取り組んでおり、私たちはmysqlテーブルの先頭にそれを保存します。このLeads
テーブルは、数百万のレコードで構成され、1秒あたり8レコード増加します。次のようにテーブルの構造は以下の通りである:Mysql:インデックス付きカウントクエリとサマリーテーブルの保守
LeadId | ProductId | UserId | RequestDate(DateTime)
テーブルスキーマ:
`id` int(11) NOT NULL AUTO_INCREMENT,
`ProductId` int(11) DEFAULT NULL,
`UserID` int(11) NOT NULL,
`RequestDateTime` datetime(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `ix_leads_requestdatetime` (`RequestDateTime`) USING BTREE,
KEY `ix_leads_productid` (`ProductId`) USING BTREE,
KEY `ix_leads_userid` (`UserID`) USING BTREE
次に、要求が一人のユーザが一日に最大10点のリードを与えるようにすることです。 Leads
表にその日のレコードの数をカウントし、< 20場合は、挿入する前にチェックするために
選択クエリ:私はこれを実装するためのアプローチを以下しています。
の特定の日付のリード数を含む
DailyLeadCount
テーブルを維持します。テーブルの構造:UserId | Date | Count
テーブルスキーマ:私は
Leads
テーブルに挿入する前に、この表の数をチェックし、それに応じて挿入した後、この数を更新します`RequestDate` date NOT NULL, `UserId` int(11) NOT NULL, `LeadCount` smallint(6) NOT NULL, PRIMARY KEY (`RequestDate`,`UserId`)
。また、この表では1日のデータだけが有用なので、毎日アーカイブするジョブを作成します。
どのアプローチが良いですか? Leads
テーブルで選択クエリを実行すると、挿入/更新より重くなり、DailyLeadCount
テーブルのクエリを選択するよりも重いのですか?
毎日テーブルを管理し、アーカイブする価値はありますか?
これを処理する他の方法はありますか?
INDEX(UserID, RequestDateTime)
へ
3番目のオプションは、サブクエリでwhere句にチェックを含めるようにinsert文を作成することです。インデックスを含むテーブルスキーマを表示できますか? –
@SloanThrasherテーブルスキーマを追加しました。また、ストアド・プロシージャ内にある場合は、where句で副問合せを追加することは、パフォーマンスに関してアプローチ-1と同じです。ではない? – ctor
正確には一致しません。 #1では、selectとinsertの2つのクエリがあります。調べる最も良い方法は、両方のクエリを記述し、サーバーがどのように作業を実行するかを理解するためにExplainを使用することです。 –