我有这样一个log表,它在MySQL数据库中保存我所有表的所有日志:
+-------+-----------+-------------+-------------+-----------+--------+
| LogID | LogTypeID | LogDateTime | ReferenceID | TableName | UserID |
+-------+-----------+-------------+-------------+-----------+--------+
| 1 | 1 | 2012-10... | 1 | client | 1 |
| 2 | 1 | 2012-10... | 1 | plan | 1 |
| ... | ... | ... | ... | ... | ... |
+-------+-----------+-------------+-------------+-----------+--------+当我在数据库中插入、更新或删除由我的log列标识的表时,LogTypeID表将保存所有日志。ReferenceID列是在我的TableName列中标识的表的主键,我的所有int(10)键都有相同的int(10)类型,对于ReferenceID列也是一样的。
我总是使用我的log表来识别何时插入这些数据,所以我无法清除日志。
我一开始对此没有任何问题,但是现在我的查询在使用log 表时变得很慢,因为有很多数据。i 努力提高我的数据库服务器的性能和它变得比以前快了一点,但仍然很慢。我的大多数查询都是INNER JOIN对log表的查询。
我考虑在使用ReferenceID表的所有表中添加一个外键,因为我认为Keys可以提高查询的性能,但我不确定它是否可行。
我可以将我的ReferenceID列作为所有表的外键吗?
我的数据库服务器是MySQL服务器5.5.25,我的表都是InnoDB。
请帮忙,谢谢。
发布于 2012-11-09 03:23:53
如果我正确理解并且ReferenceID持有不同的表PRIMARY KEY值,您将无法将其定义为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`);https://stackoverflow.com/questions/13301623
复制相似问题