ホームページ  >  記事  >  バックエンド開発  >  mysqlはデータテーブルを垂直に分割します

mysqlはデータテーブルを垂直に分割します

WBOY
WBOYオリジナル
2016-09-15 11:30:591110ブラウズ

開発プロセス中に、このような問題に遭遇しました。データベースには、記事の関連情報 (タイトル、内容、著者、作成時刻、コレクション数など) を保存するための記事テーブルがあります。 、そして別のテーブルがあり、ユーザーと記事の間のコレクション関係を保存するために使用されます (主なフィールドは、記事が初めて表示されるときに、記事データを取得します)。データベースとデータは Redis にキャッシュされるため、パフォーマンスが向上します。
しかし今は、記事が収集または収集されないたびに、記事テーブルの コレクション数 フィールドが更新され、記事のキャッシュがクリアされるためです (これが、更新ではなくキャッシュをクリアすることを選択した理由です)キャッシュはダーティ データの生成を避けるためです)。次に記事にアクセスするときにデータベースがクエリされ、データがキャッシュされるため、パフォーマンスに一定の影響があります。

そこで、記事テーブルのコレクション数を分割して新しいコレクションテーブルを作成し(主なフィールドは主キーID、記事ID、コレクション数)、記事データをキャッシュするときにコレクション数を個別にキャッシュすることにしました。 , そのため、記事を収集したり、お気に入りに登録していない記事を収集するときに、毎回記事テーブルを更新する必要はありません。記事収集数テーブルを更新した後、キャッシュが直接更新されます(ダーティデータが発生しない理由)。ここで懸念されるのは、コレクション数は特に重要なデータではないため、多少の誤差があっても悪影響を与えるものではありません。

上記の解決策を使用すると、2 つの質問が生じます。答えていただければ幸いです。

  1. 記事コレクション数の主キーIDと記事IDフィールドは一意で重複しないフィールドのため、主キーIDフィールドを省略して記事IDを直接主キーとして使用することは可能でしょうか?

  2. 記事が追加されるたびに、記事IDに対応する記事収集データが同期していない場合、記事の収集・未収集時に記事収集番号が更新されるたびに、最初に記事IDに対応する記事収集番号が更新されるかどうかを問い合わせる必要があります。記事コレクション数テーブルは、記事IDに対応するコレクション番号が既に存在する場合は、記事のコレクション番号を直接更新します。簡単にするために、記事IDに対応する記事コレクションデータを毎回追加することにしました。今後記事コレクション数を更新するときに、最初にデータが存在するかどうかを判断する必要はなく、直接同期することができます。この場合、記事データの追加と新しい記事の追加を回避するにはどうすればよいでしょうか?トランザクションを使用すると回避できることはわかっていますが、もっと簡単な方法はありますか?データを追加するときに、MySQL は自動的にデータを別のテーブルに追加できますか? (データベースのカス〜)

上記ありがとうございます!

返信内容:

開発プロセス中に、このような問題に遭遇しました。データベースには、記事の関連情報 (タイトル、内容、著者、作成時刻、

コレクション数など) を保存するための記事テーブルがあります。 、そして別のテーブルがあり、ユーザーと記事の間のコレクション関係を保存するために使用されます (主なフィールドは、記事が初めて表示されるときに、記事データを取得します)。データベースとデータは Redis にキャッシュされるため、パフォーマンスが向上します。 しかし今は、記事が収集または収集されないたびに、記事テーブルの
コレクション数 フィールドが更新され、記事のキャッシュがクリアされるためです (更新ではなくキャッシュをクリアすることを選択した理由はこれです)キャッシュはダーティ データの生成を避けるためです)。次に記事にアクセスするときにデータベースがクエリされ、データがキャッシュされるため、パフォーマンスに一定の影響があります。

そこで、記事テーブルのコレクション数を分割して新しいコレクションテーブルを作成し(主なフィールドは主キーID、記事ID、コレクション数)、記事データをキャッシュするときにコレクション数を個別にキャッシュすることにしました。 , そのため、記事を収集したり、お気に入りに登録していない記事を収集するときに、毎回記事テーブルを更新する必要はありません。記事収集数テーブルを更新した後、キャッシュが直接更新されます(ダーティデータが発生しない理由)。ここで懸念されるのは、収集数は特に重要なデータではないため、多少の誤差があっても悪影響を及ぼすことはありません)。

上記の解決策を使用すると、2 つの質問が生じます。答えていただければ幸いです。

  1. 記事コレクション数の主キーIDと記事IDフィールドは一意で重複しないフィールドのため、主キーIDフィールドを省略して記事IDを直接主キーとして使用することは可能でしょうか?

  2. 記事が追加されるたびに、記事IDに対応する記事収集データが同期していない場合、記事の収集・未収集時に記事収集番号が更新されるたびに、最初に記事IDに対応する記事収集番号が更新されるかどうかを問い合わせる必要があります。記事コレクション数テーブルは、記事IDに対応するコレクション番号が既に存在する場合は、記事のコレクション番号を直接更新します。簡単にするために、記事IDに対応する記事コレクションデータを毎回追加することにしました。今後記事コレクション数を更新するときに、最初にデータが存在するかどうかを判断する必要はなく、直接同期することができます。この場合、記事データの追加と新しい記事の追加を回避するにはどうすればよいでしょうか?トランザクションを使用すると回避できることはわかっていますが、もっと簡単な方法はありますか?データを追加するときに、MySQL は自動的にデータを別のテーブルに追加できますか? (データベースのカス〜)

上記ありがとうございます!

1. はい、ただしここではリンクを行う必要があります。つまり、記事を追加または削除するときに、記事収集テーブルも操作する必要があります

2 mysql の udf を使用します。詳細については、MySQL :: MySQL 5.1 リファレンス マニュアル :: 22.3 MySQL への新しい関数の追加を参照してください。次に、トリガーを使用して記事テーブル

の後に関数を呼び出し、記事コレクション テーブルに書き込みます。大体こんな感じです。 deleteinsert

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。