1

logMySQLデータベース内のすべてのテーブルのすべてのログを保存する次のようなテーブルがあります。

+-------+-----------+-------------+-------------+-----------+--------+
| LogID | LogTypeID | LogDateTime | ReferenceID | TableName | UserID |
+-------+-----------+-------------+-------------+-----------+--------+
|     1 |         1 |  2012-10... |           1 |    client |      1 |
|     2 |         1 |  2012-10... |           1 |      plan |      1 |
|   ... |       ... |         ... |         ... |       ... |    ... |
+-------+-----------+-------------+-------------+-----------+--------+

列で識別されるデータベースのテーブルに挿入、更新、または削除すると、テーブルにすべてログ保存logれます。この列は、私の列で識別されたテーブルの主キーです。すべてのPrimayキーは同じタイプであり、列でも同じです。LogTypeIDReferenceIDTableNameint(10)ReferenceID

このデータがいつ挿入されたかを識別するために常にlogテーブルを使用しているため、ログをクリアできません。

最初は問題ありませんが、logデータが多いため、テーブルを使用するとクエリが遅くなります。データベースサーバーのパフォーマンスを改善しようとすると、以前より少し速くなりますが、それでも低速です。テーブルINNER JOINへの私のクエリのほとんど。log

キーによってクエリのパフォーマンスが向上する可能性があるため、テーブルを使用するすべてのテーブルに外部キーを追加することを考えていましたが、それが実現可能かどうかはわかりません。ReferenceIDlog

ReferenceID列をすべてのテーブルの外部キーにすることはできますか?

私のデータベースサーバーはMySQLServer5.5.25で、テーブルはすべてInnoDBです。

よろしくお願いします。

4

1 に答える 1

1

私が正しく理解し、ReferenceID異なるテーブル値を保持している場合、制約は単一のテーブルのみを参照でき、他の列の値に基づいて切り替えることができないPRIMARY KEYため、それを として定義することはできません。FOREIGN KEYFOREIGN KEY

代わりに、 と のそれぞれにインデックスを作成するReferenceIDTableName、両方の複合インデックスを作成することもできます。

CREATE INDEX `idx_referenceid` ON `log` (`ReferenceID`);
CREATE INDEX `idx_tablename` ON `log` (`TableName`);

または、両方の列の複合インデックスとして、クエリを実行するために常に両方が必要であると仮定しますlog

CREATE INDEX `idx_referenceid_tablename` ON `log` (`ReferenceID`,`TableName`);
于 2012-11-09T03:23:53.263 に答える