1

views現在のを更新する必要がありpostます。テーブルpostsウィッチからのデータは 200 万を超えています。そして、ページの読み込み時間が遅いです。

テーブル:

idpost | iduser | views | title        |
1      | 5675   | 45645 | some title   |
2      | 345    | 457   | some title 2 |
6      | 45     | 98    | some title 3 |
and many more... up to 2 millions

そしてiduser持っているIndexidpost持っているPrimary key

データを分離して新しいテーブルを作成し、ビューの値を取得するためにpost_views使用するとします。LEFT JOIN新しいテーブルはまだ小さいため、最初は高速ですが、時間の経過とともに 200 万行を超えることもあります。そしてまた遅くなります。巨大なテーブルをどのように扱いますか?

4

1 に答える 1

1

テーブルを分割する

テーブルを分割して、異なるものを分離し、titleデータの繰り返しを防ぐ必要があります。これはより良いデザインになります。次のスキーマをお勧めします。

posts(idpost, title)    
post_views(idpost, iduser, views)

更新views回数

views一度に 1 行だけ更新する必要があります。誰かがあなたのページを表示したため、関連する行を更新します。そのため、検索のオーバーヘッドなしで一度に 1 行だけ更新します (キーとインデックスのおかげです)。これがどのようにオーバーヘッドになるのか理解できませんでしたか?

合計を取得するviews

おそらく、次のようなクエリを実行します。

SELECT SUM(views) FROM post_views WHERE idpost = 100

はい、これによりオーバーヘッドが発生する可能性があります。新しいテーブルを作成し、 で更新するたびtotal_post_viewsに、このテーブルの対応する値を更新することで解決できる場合があります。したがって、を取り除き、合計ビュー数に直接アクセスします。post_viewsLEFT JOIN

ただし、更新ごとに更新すると、オーバーヘッドも発生します。パフォーマンスを向上させるために、 で更新するtotal_post_viewsたびに更新を中止できますpost_views。この方法を選択すると、更新を実行できます。

  • 定期的に、たとえば 30 秒ごとに、
  • の特定の更新回数の後post_views、たとえば 30 回の更新ごとに。

もちろん、このようにしておおよその結果が得られます。これが許容できる場合は、この方法をお勧めします。

于 2012-08-02T08:52:00.013 に答える