1

我有一个log这样的表,可以将我的所有表的所有日志保存在我的 MySQL 数据库中:

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

当我InsertUpdateDelete时,该log表将所有日志保存到由我的列标识的数据库中的表中。该列是我的列中标识的表的主键,我所有的主键都具有相同的类型,并且对于该列也是相同的。LogTypeIDReferenceIDTableNameint(10)ReferenceID

我总是使用我的log表来识别何时插入此数据,因此我无法清除日志。

一开始我没有问题,但是现在log由于数据很多,使用表时我的查询变得很慢。尝试提高我的数据库服务器的性能,它变得比以前快一点,但仍然很慢。INNER JOIN我对log表格的大部分查询。

我正在考虑将外键添加到ReferenceID所有使用该log表的表中,因为我认为键可以提高我的查询性能,但我不确定它是否可行。

我可以让我的ReferenceID列成为我所有表的外键吗?

我的数据库服务器是 MySQL Server 5.5.25,我的表都是 InnoDB。

请帮助,提前谢谢。

4

1 回答 1

1

如果我理解正确并ReferenceID持有不同的表PRIMARY KEY值,您将无法将其定义为 a FOREIGN KEY,因为FOREIGN KEY约束只能引用单个表并且不能基于其他列值进行切换。

相反,您可以在每个ReferenceID和上创建一个索引TableName,或者甚至可以在它们之间创建一个复合索引:

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 回答