这里应该使用复合索引,其中一个字段将用于两个单独的WHERE子句中吗?

时间:2012-06-26 09:03:55

标签: mysql select indexing where-clause database-performance

好的,我知道应该使用索引的基础知识以及使用索引的优缺点。

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

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在两个复合索引中都重叠,我不确定这是否可行。这种重叠会对性能产生影响吗?

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

1 个答案:

答案 0 :(得分:1)

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

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