如果客户决定使用任一字段来搜索记录,人们通常会将表中的每一列作为二级索引以保证安全吗?
搜索首先通过二级索引再到主键吗?从而缩小到所要求的数据?
如果您已经拥有作为主键的列,那么拥有二级索引有什么意义?
答案 0 :(得分:3)
(以下响应适用于Sql Server。某些部分可能因其他DBMS而异。)
最后一个问题:“如果您已经拥有一个主键列,那么拥有二级密钥有什么意义?”我用表"People (Id int primary key, firstname varchar(40), middlename varchar(40), lastname varchar(40))".
的示例来说明现在考虑查询"select * from people where lastname = 'flynn'".
如果lastname列上没有索引,则将按顺序扫描表以查找匹配项。必须访问每一行。主键索引在这里根本没用。如果索引lastname列,则可以更快地找到结果。
您通常只会索引那些对您的应用程序发出的查询有用的列。如果您的查询从未在名为“MiddleName”的列上具有连接或条件,则索引该列不会带来任何好处。您不希望添加不必要的索引,因为它们会增加涉及该列的数据插入和更新的成本。
我们通常说Sql Server在查询中每个表实例只使用一个索引。所以像“select * from first where first ='Elroy'和lastname ='Flynn'”这样的查询最多只能使用一个索引,即使firstname和lastname都有索引。 Sql Server将根据从数据值中收集的统计信息选择一个或另一个索引。
完全完整,我必须在这里得到一点进展,并讨论聚簇索引和非聚簇索引。一个表只能有一个聚簇索引:其余的都是非聚簇索引。尽管在上一段中,当使用非聚集索引来解析查询时,索引查找会生成一个中间结果,该结果是与聚簇索引(通常是主键)中的任何索引相关联的键的完整值。也就是说,每个非聚集索引的叶子都包含聚簇键值,而不是行指针。找到此聚簇键后,聚簇索引将用于解析对特定数据库行的查找。因此,最终,所有索引查找最终都使用聚集索引。
但是,出于实际目的,通常说每个表实例只使用一个索引就足够简单了。请注意,如果表在查询中有别名以使其出现多次,则可以将不同的索引用于不同的引用。例如,“select * from people p1 join people p2 on p1.firstname = p2.lastname"
可以在p1实例上使用firstname索引,在p2实例上使用lastname索引。
请参阅http://msdn.microsoft.com/en-us/library/aa933131(v=SQL.80).aspx
答案 1 :(得分:1)
通常只会索引需要的列。添加额外的索引通常被认为是过早优化。
大多数优化器将确定找到最少记录数的最快方法。这可能是使用和索引,但可能是全表扫描。如果有多个索引可以使用,通常只使用一个索引,并将结果记录与其余条件进行比较。如果使用多个索引,则需要匹配生成的结果集,并消除两个索引中未找到的记录。
对于自然键可能发生变化或非常(故意模糊)长的表使用代理键是很常见的。在这种情况下,自然键将被索引为辅助唯一键。在某些情况下,可能存在竞争的自然键,在这种情况下,所有自然键都将具有唯一索引。
答案 2 :(得分:1)
尚未提及的另一个项目,必须维护每个附加索引。因此,如果索引覆盖了几个不同组合的所有列,它们不仅会占用大量空间,而且每次更新/插入/删除都有可能更改这些索引中的一个或多个。这将导致这些操作在许多情况下减慢速度。
这总是一个权衡。您拥有的索引越多,服务器必须做的工作就越多,以使它们保持最新,但更有可能的是,您至少有一个会覆盖您在该表中抛出的任何查询。
答案 3 :(得分:0)
“安全方面”?否。
索引交易空间和选择时间的插入时间。不必要的密钥会占用磁盘空间并减慢插入速度,以加快从未发生的查询速度。
与所有优化一样,查询优化最后 - 构建系统,然后观察其行为。
高度技术性的主要/次要区别。存在所有索引以加速查询和/或强制执行某些完整性约束。