1

私はクエリを実行しています -

SELECT COUNT(DISTINCT c.msisdn) 
FROM cdr c 
WHERE c.evedate>='2013-10-01';

初めて実行すると、1 分かかります。ただし、同じクエリを 1 秒以内に実行すると 3 分かかります。

なぜそれが起こっているのですか?

他のクエリでも同じ動作を見つけました。

必要に応じて詳細:
私のマシンには 4 GB RAM の
Mysql 5.5 バージョンがあります。
key_buffer_size = 350M。

このテーブルには、10 個のパーティションを持つ 1 億 4000 万のレコードがあります。

ありがとうございました。

4

1 に答える 1

1

インデックスはありますか

 ( eveDate, msisdn )

これにより、インデックスがカバーされ、ID の実際のデータ ページに移動する必要がなくなりますが、where 句の「eveDate」部分によってクエリが最適化されます。

フィードバックごとの提案。

データが日付ベースの場合は、問題の日付 (または、時間ごとのインデックスがあると述べたので、作業に適している場合は時間ごと) と ID の数だけを含む別のテーブルを用意することをお勧めします。 . 1 日の活動が変わらない (またはめったにない) 場合、このテーブルにはカウントが表示されます。過去 10 日間のように、夜間に実行して 1 日/1 時間ごとにカウントを更新したとしても、その後のクエリはほぼ瞬時に実行されます。

さらに、これらすべてのレコードを使用して、問題のテーブルにトリガーを作成することもできます。新しいレコードが追加されると、カウンターテーブルへの挿入/更新が行われます...

update CountersSummary
   set TotalCount = TotalCount +1
   where eveDate = just date portion of DateTimeValueOfNewRecord
      and eveHour = hour of DateTimeValueOfNewRecord

if the record count updated = 0
   insert into CountersSummary ( eveDate, eveHour, TotalCount )
      values ( just date portion of DateTimeValueOfNewRecord,
               hour of DateTimeValueOfNewRecord,
               1 )
end if
于 2013-12-09T11:10:09.963 に答える