我有一個大的MySQL InnoDB表(大約1百萬條記錄,每週增加300K)讓我們來說說博客文章。這個表格有一個帶有索引的url字段。在數據庫中使用MD5(URL)而不是URL用於WHERE
通過添加新記錄,我正在檢查具有相同網址的現有記錄。下面是查詢的樣子:
SELECT COUNT(*) FROM `tablename` WHERE url='http://www.google.com/';
當前系統每秒產生大約10-20個查詢,這個數量將會增加。我正在考慮通過添加URL的MD5散列的其他字段來提高性能。
SELECT COUNT(*) FROM `tablename` WHERE md5url=MD5('http://www.google.com/');
所以它會更短,並且具有恆定的長度,這對於索引來說比URL字段更好。你們對此有何想法?是否有意義?
我的朋友的另一個建議是使用CRC32而不是MD5,但我不確定CRC32的結果有多獨特。讓我知道你對這個角色的看法。
更新:URL列對每一行都是唯一的。
我認爲「非羣集」是SQL Server的術語 - 不應該只是作爲索引讀取嗎? – 2009-09-08 17:12:18
非聚集索引是數據上的「虛擬」索引,而聚簇索引是數據上的物理索引。每個表只能有一個聚簇索引,而在同一個表上可以有多個非聚簇索引 – 2009-09-08 17:15:38
同意,NC索引將獲得與添加MD5或其他哈希相同或相似的性能。如果每個網址的表名記錄比例很高,我會考慮使用兩個表結構,其中唯一的網址保存在tblUrls中,而tablename只存儲相應的鍵。這可能會稍微提高插入性能,但也會降低存儲要求並具有其他一些優點,具體取決於底層應用程序。 – mjv 2009-09-08 17:21:24