我们使用的是 PostgreSQL v8.2.3。
涉及表:EMPLOYEE和EMAILLIST。
Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)
2 个表以这样一种方式连接,即如果 EMPLOYEE.EMAIL1 或 EMPLOYEE.EMAIL2 没有匹配的条目,则将返回这些行。
SELECT employee.email1, employee.email2,
e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched
FROM employee
LEFT JOIN emaillist e1 ON e1.email = employee.email1
LEFT JOIN emaillist e2 ON e2.email = employee.email2
WHERE e1.email IS NULL OR e2.email IS NULL
表EMAIL
的varchar(256)列EMAILLIST
被索引。现在,响应时间为 14 秒。
表数统计:目前,EMPLOYEE 有 165,018 条记录,EMAILLIST 有 1,810,228 条记录,预计未来这两个表都会增长。
- 索引 VARCHAR 列是一个好主意/方法吗?这个问题立即出现在我的脑海中,因为我们之前没有在我们的应用程序中索引 VARCHAR 列。专家对此的建议/建议受到高度赞赏。
- 使用当前的查询和索引,14 秒的响应时间是合理的,还是有进一步调整的空间?基于这种表大小和响应时间,其他用户的实时体验/意见是什么?
注意:我的实际需求/用例在此处详细说明。
如果您要基于它进行查询,那么索引 varchar 列没有任何问题。但是请记住,某些索引以及它们可以在单个字段中索引多少是有限制的。例如,您不能索引可以包含无限量文本的列。但是,您应该能够毫无问题地对 varchar(256) 进行索引。尝试一下,并分析查询性能的改进,看看它是否有帮助。
这样索引 varchar 列没有问题
当您在十亿行表中将 varchar 列作为 FK 时,它可能会成为问题。然后,您将拥有 PK 和 FK 的代理键,但您仍然需要自然 varchar 键上的唯一约束/索引。
您的表很小,性能可能与 OR 子句有关。不幸的是,无论您如何构建查询,同样的问题都适用(而且我对 PostgresSQL 不够熟悉,无法提供很多抱歉)
尝试去掉查询中的“OR e2.email IS NULL”部分,看看它的运行速度有多快。如果它运行得更快,您可以使用“union all”更快地运行它