我有一个大的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