这是索引varchar列的好主意/方法吗?
-
16-10-2019 - |
题
我们正在使用PostgreSQL v8.2.3。
涉及桌子: 员工 和 Emaillist.
Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)
2表的加入方式是,如果员工1 email1或雇员。
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秒。
表计数统计:目前,员工拥有165,018张记录和Emaillist拥有1,810,228个记录,并且两张桌子预计将来会增长。
- 这是索引varchar列的好主意/方法吗?这个问题立即引起我的脑海,因为我们在应用程序中没有索引过varchar列的原因。专家对此的建议/建议非常感谢。
- 有了当前的查询和索引,响应时间为14秒是合理的,还是有进一步调整的范围?其他用户的实时体验/意见是基于这种表尺寸和响应时间的什么?
笔记: 我的实际需求/用例详细说明 这里.
解决方案
如果您要根据它进行查询,则索引Varchar列没有错。但是,请记住,某些索引有限制以及它们在单个字段中可以索引多少。示例您无法索引可以包含无限量文本的列。但是,您应该能够无问题地对Varchar(256)进行索引。尝试一下,并分析查询性能的改进,以查看是否有帮助。
其他提示
这样的varchar列没有问题
可能会成为问题的地方是您将VARCHAR列作为十亿行表中的FK。然后,您将拥有PK和FK的替代密钥,但是您仍然需要自然VARCHAR键上的唯一约束/索引。
您的表格很小,性能可能与或子句有关。不幸的是,无论您如何构建查询,都适用同样的问题(我对postgressql不太熟悉,以至于很抱歉)
尝试摆脱查询的“或e2.email是无效的”部分,看看它运行的速度。如果运行速度更快,您可能可以通过“联合”更快地运行它
不隶属于 dba.stackexchange