1

こんな問い合わせがありました

select count(distinct sessionKey) as tot from visits

しかし、実行に時間がかかりすぎて 48512 ms になりました。
数か月以内に、テーブルのデータは現在のデータ量の 2 倍になります。このクエリを最適化する方法

これは私のテーブル構造です

ここに画像の説明を入力

4

2 に答える 2

4

INDEX列にを追加するSessionKeyと、パフォーマンスが向上します。

ALTER TABLE visits ADD INDEX (SessionKey)
于 2012-10-19T08:58:50.243 に答える
1

他の人が示唆したように、インデックスを追加することが最初で最も簡単な方法です。そこに大量の行がある場合、それらすべてを処理するにはとにかく時間がかかる場合があります。

私はかつてこのような問題を抱えていました.誰かがシステムをコーディングし、ユーザーがニュースエントリに投票できるようにしました. すべての投票は、データベースに 1 行として保存されました。すべてのウェブページには、「トップ投票」のニュースのリストがありました。これは基本的に、完全な投票テーブルを選択し、それらを合計し、その合計でソートするためのクエリがあることを意味していました。複数の 100k 範囲のエントリで、これにはかなりの時間がかかりました。結果を「キャッシュ」しようとすることで、私の前の誰かがそれを「解決」しました。これはほとんどの場合うまく機能しましたが、すべてのキャッシュを消去した場合、キャッシュが再度構築されるまで、ページ全体が数時間混乱します。次に、すべての投票を独自の行に保存するのではなく、すべてのエントリの合計を保存することで修正しました。

これで伝えたいこと: キャッシュを試すか (ただし、結果はもちろん「ライブ」になります)、読み取りたいカウントを格納するフィールドやテーブルを追加するなど、データベース内の何かを変更することができます。訪問テーブルへの挿入ごとに更新します。これにより、挿入時の負荷が少し増えますが、その数を取得するのは非常に安価です。

于 2012-10-19T09:17:37.940 に答える