0

好的,我知道何时应该使用索引以及使用它的利弊的基础知识。

这些是我的查询的(唯一)两种方式:

SELECT target_id FROM map WHERE table_name = '' AND fingerprint = '' AND source_id = 1;

SELECT fingerprint, source_id FROM map WHERE table_name = '' AND target_id = 1;

我知道我必须索引字段table_namefingerprintsource_id通过第一次查询。也target_id通过第二个查询。我可以单独做。但是我听说如果我可以将所有字段作为一个索引,复合键会提供更好的性能。由于我的情况非常具体,不会有另一个 WHERE 子句,我想创建这样的复合键:

(table_name, fingerprint, source_id)

(table_name, target_id)

但由于table_name两个复合索引都有重叠,我不确定这是否是要走的路。这种重叠是否会对性能产生影响?

当我进行一些测试时,我没有得到任何性能改进,两者都同样快。我现在只有几万条记录,可能就是这个原因。但数据将扩展到数百万条记录。所以我想征求专家意见。谢谢。

4

1 回答 1

1

就您尝试运行的查询而言,您拥有的两个索引是正确的。但是,我不确定在 table_name 字段上建立索引。VARCHAR 字段上的索引往往非常慢(这个答案指的是 PostgreSQL,但基本概念是相同的)并且可以扩大数据库的大小,同时使 INSERT 慢得多。

我使用的解决方案是创建一个查找表,如果我需要一个可以为我提供 VARCHAR 字段的查询,我只需在查找表上运行一个 JOIN。INT 上的 JOIN 往往相当快速且可扩展。

于 2012-06-26T14:24:08.747 回答