Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql表优化:主索引和辅助索引_Sql_Database_Database Design - Fatal编程技术网

sql表优化:主索引和辅助索引

sql表优化:主索引和辅助索引,sql,database,database-design,Sql,Database,Database Design,人们是否通常将表中的每一列都作为二级索引,以防客户决定使用其中一个字段搜索记录 搜索是否先通过二级索引,然后再到主键?从而缩小到要求的数据范围 如果您已经有一个列是主键,那么使用二级索引有什么意义呢??没有 索引将空间和插入时间交换为选定时间。不必要的键会占用磁盘空间并减慢插入速度,从而加速从未发生的查询 与所有优化一样,查询优化最后一次构建系统,然后观察其行为 一个高度技术性的项目中的主要/次要区别。所有索引的存在都是为了加快查询速度和/或强制执行某些完整性约束。通常您只对需要索引的列进行索引

人们是否通常将表中的每一列都作为二级索引,以防客户决定使用其中一个字段搜索记录

搜索是否先通过二级索引,然后再到主键?从而缩小到要求的数据范围

如果您已经有一个列是主键,那么使用二级索引有什么意义呢?

?没有

索引将空间和插入时间交换为选定时间。不必要的键会占用磁盘空间并减慢插入速度,从而加速从未发生的查询

与所有优化一样,查询优化最后一次构建系统,然后观察其行为


一个高度技术性的项目中的主要/次要区别。所有索引的存在都是为了加快查询速度和/或强制执行某些完整性约束。

通常您只对需要索引的列进行索引。添加额外的索引通常被认为是过早的优化

大多数优化器将确定最快的方法来查找最少数量的记录。这可能是为了使用和索引,但可能是一个完整的表扫描。如果可以使用多个索引,通常只使用一个索引,并将结果记录与其余标准进行比较。如果使用多个索引,则需要匹配结果集,并消除两个索引中未找到的记录


对于自然键可能会发生更改或非常有目的地模糊的表,通常使用代理键。在这种情况下,自然密钥将作为辅助唯一密钥进行索引。在某些情况下,可能存在相互竞争的自然密钥,在这种情况下,所有自然密钥都将具有唯一的索引。

以下响应适用于Sql Server。对于其他DBMS,某些部分可能会有所不同

首先是最后一个问题:如果已经有一个列是主键,那么使用辅助键有什么意义?我用表People Id int主键firstname varchar40、middlename varchar40、lastname varchar40的示例进行说明。现在考虑来自LastNe=“弗林”的人的查询选择*。如果lastname列上没有索引,则将按顺序扫描该表以查找匹配项。必须访问每一行。主键索引在这里毫无帮助。如果索引lastname列,则可以更快地找到结果

您通常只对那些对应用程序问题的查询有用的列进行索引。如果您的查询在名为MiddleName的列上从来没有连接或where条件,那么索引该列将不会带来任何好处。您不希望添加不必要的索引,因为它们会增加涉及该列的数据插入和更新的成本

我们通常说Sql Server在查询中每个表实例只使用一个索引。因此,像select*这样的查询来自firstname='Elroy'和lastname='Flynn'最多使用一个索引的人,即使firstname和lastname都有索引。Sql Server将根据从数据值中收集的统计信息选择一个或另一个索引

完整地说,我必须在这里取得一些进展,并讨论聚集索引与非聚集索引。一个表只能有一个聚集索引:其余的是非聚集索引。尽管有上一段的内容,但当使用非聚集索引解析查询时,索引查找会产生一个中间结果,即与聚集索引(通常为主键)相关联的键的完整值。也就是说,每个非聚集索引的叶包含聚集键值,而不是行指针。找到此聚集键后,聚集索引将用于解析特定数据库行的查找。因此,所有索引查找最终都使用聚集索引

不过,出于实际目的,通常可以简单地说,每个表实例只使用一个索引。请注意,如果一个表在查询中有别名,因此它会多次出现,则可以对不同的引用使用不同的索引。e、 例如,选择*from people p1 join people p2 on p1.firstname=p2.lastname可以在p1实例上使用firstname索引,在p2实例上使用lastname索引


请参见另一项尚未提及的内容,每增加一个索引都必须保留。因此,如果索引以几种不同的组合覆盖所有列,它们不仅会占用大量空间,而且每次更新/插入/删除都有可能更改其中一个或多个索引。这将导致在许多情况下,这些操作的速度大大减慢

这总是一种权衡。索引越多,服务器需要做的工作就越多,以使它们保持最新,但最有可能的是,您至少会有一个索引覆盖您抛出的任何查询
那张桌子

您的问题似乎是关于索引而不是键。其他人也是这样解释的,我现在相应地编辑了这个问题。如果你真的想问关于钥匙的问题,请撤销我的编辑并澄清你的问题,因为这将是一个明显不同的问题。