我有一个包含数百万行的表。我需要找到具有特定列值的所有行。该列不在索引中,因此会产生表扫描结果。
但是添加一个列在头部(主键后面)的索引,进行查询,然后删除索引会更快吗?
我无法永久添加索引,因为用户正在指定他们要查找的列。
最佳答案
需要思考的两个问题:
- 可以为查询指定多少列?
- 数据是否经常变化?很多吗?
如果您有少量个候选列,并且数据没有很多变化,那么您可能需要考虑在任何或甚至所有候选列。
“亵渎!”,我听到了。大多数消息来源告诉您“永远不要”为表的每一列编制索引,但该建议是基于表被频繁修改的一般假设。
您将付出额外存储空间的代价,并在数据更改时影响性能。
多小是小,多少是很多,权衡是否值得? 没有办法告诉修道院,因为“太慢”通常是一种主观衡量。
您将不得不尝试一下,测量索引的大小,然后测量它们在搜索中的效果。您必须在成本与提高客户满意度之间取得平衡。
[已添加]哦,还有一件事:临时索引不仅在物理上比表扫描慢,而且它们会破坏您的并发性。重新索引表通常(总是?)需要全表锁,因此实际上一次只能执行一个用户搜索。
祝你好运。
关于sql - 表扫描与添加索引——哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30094/