0

私は2つのテーブルを持っています...

テーブル「タグ」

+---------+----------+
|  tag    |   id     |
+---------+----------+
|  nancy  |   902    |
+---------+----------+
|  fred   |   903    |
+---------+----------+
|  suzan  |   904    |
+---------+----------+
|  joe    |   905    |
+---------+----------+

とタグするテーブルタグ

+---------+----------+
|  tag_a  |   tag_b  |
+---------+----------+
|  903    |   902    |
+---------+----------+
|  905    |   903    |
+---------+----------+
|  902    |   904    |
+---------+----------+
|  904    |   905    |
+---------+----------+

「タグ」テーブルでINNERJOINステートメントを使用してタグとタグの関係をスキャンすることがよくあります。これにより、「ナンシー」に関連するユーザーを照会できます。タグテーブルを結合するのではなく、タグの名前をタグテーブルにダンプするだけで、タグ名に基づいて関係を検索できるようになったほうがよいのではないかと思います。テーブルに参加することは、パフォーマンスに大きな打撃を与えますか?タグ間テーブルは900k行の範囲にあります。タグテーブルは約30kです。

4

1 に答える 1

1

タグに関するメタ情報を保存したい場合は、tagとにかくテーブルが必要になります。結合を追加すると、クエリの費用が大幅に増える可能性があります。

あなたの場合、次のことを検討することをお勧めします。

  1. InnoDBを使用する
  2. idに変更TagString
  3. 実際のタグをに配置しますTagString
  4. Tagカスケード更新/削除を使用して、テーブルへの外部キーを作成します

このようにして、1つの列でグループ化、フィルタリングなどを行うことができますが、さらに情報が必要な場合は、Tagテーブル(または必要なテーブル)に結合できます。

80,000,000のタグレコードに到達し、 http://tagcloud.comでタグクラウドを生成するためにライブ結合を行っていたときに、MySQLでいくつかの深刻なパフォーマンスの問題に遭遇しました...いくつかのキャッシングはそれを本当に助けましたが、それでも、それはプッシュしているように見えましたリレーショナルデータベースの設計限界(通常の形式)。別のストレージ形式を使用したほうがよいでしょう。これは、書き込みにコストがかかる可能性がありますが、読み取りは高速です。

于 2012-10-22T16:05:54.390 に答える