我有一张包含数百万行的表。我需要找到具有特定列值的所有行。该列不在索引中,因此表扫描结果。
但是在头部添加一个索引(下面是主键)会更快,执行查询,然后删除索引吗?
我无法永久添加索引,因为用户正在指定他们正在寻找的列。
答案 0 :(得分:9)
要考虑两个问题:
如果您有小个候选列,并且数据很多,那么您可能需要考虑在任何或上添加永久索引甚至所有候选专栏。
“ Blasphemy!”,我听到了。大多数消息来源告诉您“永远不会”索引表的每一列,但建议根据表格经常修改的通用假设。
您将支付额外存储空间的价格,以及数据更改时的性能损失。
小有多小,多少,是否值得权衡? 没有办法告诉小修道院,因为“太慢”通常是一种主观测量。
您必须尝试它,测量索引的大小,然后测量它们在搜索中的效果。您必须平衡成本与客户满意度的提高。
[已添加] 哦,还有一件事:临时索引不仅物理上比表扫描慢,而且会破坏你的并发性。通常(总是?)重新索引表需要一个完整的表锁,因此实际上一次只能进行一次用户搜索。
祝你好运。答案 1 :(得分:8)
我不是DBA,但我猜想构建索引无论如何都需要扫描表。
除非该列上有多个查询,否则我建议不要创建索引。
最好检查两种方式的解释计划/执行时间!
答案 2 :(得分:3)
正如其他人所说的那样,添加索引肯定不会比完成该列的完整扫描更快。
但是,我建议跟踪查询模式并找出最常搜索的列,并至少为它们添加索引。您可能会发现3-4个索引可以加快查询速度的90%。
答案 3 :(得分:2)
添加索引需要进行表扫描,因此如果您无法添加永久索引,则听起来像单次扫描会稍微快一点。
答案 4 :(得分:2)
不,那不会更快。更快的是只需添加索引并将其留在那里!
当然,对每列进行索引可能不切实际,但可能会再次对其进行索引。如何将数据添加到表中?
答案 5 :(得分:2)
不会。即使计算复杂度相同,创建索引也比简单地扫描列更复杂。
那就是说 - 你有多少列?如果单个查找的查询时间太长,您确定不能仅为每个索引创建索引吗?
答案 6 :(得分:2)
这取决于查询的复杂程度。如果您要检索一次数据,那么执行表扫描会更快。但是,如果您要在同一查询中多次返回表中查找相关信息,那么索引会更快。
另一个相关策略是执行表扫描,并将所有数据放在临时表中。然后索引THAT,然后您可以对索引数据子集执行所有后续选择,分组和许多其他查询。使用临时表在相关表中查找相关信息的好处是更快。
但是,如今空间很便宜,所以最好通过检查用户实际使用系统的方式以及在频繁列上添加索引来获得最佳服务。我还没有看到用户一直使用所有搜索参数。
答案 7 :(得分:2)
除非您为每列添加永久索引,并且包含列的列表中的查询中返回的所有列(覆盖索引),否则您的解决方案将无法扩展。这些索引会非常大,对该表的插入和更新会慢一点,但如果允许用户任意选择搜索列,则没有太多选择。
有多少列?数据多久更新一次?插入和更新需要多快才能运行?根据这些问题的答案,需要权衡利弊。做大量的实验和测试,以确保事情的确定性。
但是对于您的原始问题,只有在查询期间执行多个选择时,为单个查询添加和删除索引才有用(例如,select在运行的子查询中)每一行都返回了。)