2012-11-09 35 views
1

我有一個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列中標識的表的主鍵,我所有的Primay Keys具有相同類型int(10),並且ReferenceID列也是相同的。

我總是用我的log表來識別這個數據是什麼時候插入的,所以我不能清除日誌。

我起初沒有問題,但現在我的查詢變得很慢,因爲有很多數據使用log表。try to improve the performance of my database server它變得比以前快一點,但它仍然是緩慢的。我的大部分查詢INNER JOINlog表。

我想加入外鍵ReferenceID到使用log表,因爲我覺得鍵可以提高我的查詢性能的所有表的,但我不知道這是否是可行的。

我可以使我的ReferenceID列成爲我所有表格的外鍵嗎?

我的數據庫服務器是MySQL Server 5.5.25,我的表都是InnoDB。

請幫助,在此先感謝。

+0

您能否在這裏提供EXPLAIN或EXPLAIN EXTENDED結果。這是我們需要查看性能檢查的第一件事情。 –

回答

1

如果我理解正確和ReferenceID持有不同的表PRIMARY KEY值,你將不能夠把它定義爲一個FOREIGN KEY,因爲FOREIGN KEY約束只能引用單個表,不能切換基於其他列的值。

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

還是橫跨兩列一個綜合指數,假設你總是需要兩個:

相反,你可以在他們兩人創建各自的ReferenceIDTableName,或者甚至是一個綜合指數的指數查詢log

CREATE INDEX `idx_referenceid_tablename` ON `log` (`ReferenceID`,`TableName`); 
+0

'INDEX'會幫助提高我的查詢性能嗎? –

+0

是的。外鍵約束也會創建一個索引,但是你的表結構不允許這樣做。因此,您可以嘗試單獨將索引列爲一對索引。 –

+1

它確實!從15.0s到0.6s。非常感謝你! –