2

次のフィールドを持つmysqlデータベーステーブル「記事」があるとしましょう:id、、、、titleurlviews

インデックスでマークされたフィールドと、インデックスでマークtitleされたフィールドがあります。FULLTEXTurlUNIQUE

私の質問は、次のような通常の更新を行う場合です。

UPDATE 'article' SET views = views + 1 WHERE id = {id} 

...これにより、mysql テーブルのインデックスが更新されますか?

viewsフィールドをテーブルに保持することは (速度の観点から) 安全ですか、それとも次のフィールドarticleを使用して別のテーブルを作成する必要がありますか?article_statsarticle_idviews

4

2 に答える 2

0

Cal に同意します。インデックスは、「インデックスを更新すると」更新ステートメントで更新されます。あなたのケースの特定の例では、インデックスはビューフィールドに関連していないため更新されませんが、ビューの更新は非常に頻繁な操作であり、プログラムでバイナリを使用して共有メモリにビューの更新を保持できるため、速度が低下しますツリーまたはハッシュ テーブルを作成し、一定の時間またはサイズ ポイントの後にそれらをまとめて更新します。最高の速度を得るには、メモリテーブルを使用することもできます。これは揮発性ですが、データを時々実際のテーブルに転送できます。これにより、「ビュー」の更新ごとにハードディスク ライターを処理する必要がなくなります。

別のテーブルを保持しても同じ結果になります。選択があるときに更新があるため、アプリケーションの速度が低下します。更新中の行は、更新が完了するまでロックされ、別のリーダーが行レベルの操作を待機します。別のテーブルであっても、そのビュー数を表示するための選択がまだあります。

それだけの負荷がある場合は、マスター サーバーとスレーブ サーバーを使用して、読み取りと書き込みを分離し、時々同期することができます。

于 2012-04-10T00:40:05.427 に答える
0

はい、UPDATEステートメントはインデックスを更新します。MySQL はインデックスを自動的に管理します。インデックスを手動で更新したり、更新をトリガーしたりすることを心配する必要はありません。UPDATEその特定が列を含まないインデックスを変更するかどうかを尋ねている場合views-いいえ、そうしません。関連するインデックスのみが更新されます。

views各ビューに関する追加情報 (いつ発生したか、ビューを作成したユーザーなど) を追跡する必要がない限り、列を保持することは問題ありません。

ただし、SQL には構文エラーが含まれています。のようなテーブル名を引用することはできません'article'。テーブル名を引用する必要がある場合 (たとえば、SQL 予約語が含まれている場合)、次のようにバッククォートを使用します。

UPDATE  `article` SET ...
于 2012-04-10T00:31:49.260 に答える