- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
人们是否通常将表中的每一列都设为二级索引,以防万一客户决定使用任一字段来搜索记录?
搜索是否先通过二级索引,然后到主键?从而缩小到请求的数据?
如果您已经有一个主键列,那么使用二级索引有什么意义?
最佳答案
(以下响应适用于 Sql Server。某些部分可能因其他 DBMS 而异。)
首先是最后一个问题:“如果您已经有一个作为主键的列,那么使用辅助键有什么意义呢?”我用表 “People (Id int primary key, firstname varchar(40), middlename varchar(40), lastname varchar(40))” 的例子来说明。
现在考虑查询 “select * from people where lastname = 'flynn'”。
如果 lastname 列上没有索引,将按顺序扫描表以查找匹配项。必须访问每一行。主键索引在这里根本没有帮助。如果您为姓氏列编制索引,则可以更快地找到结果。
您通常只会索引那些对您的应用程序发出的查询有用的列。如果您的查询从未在名为“MiddleName”的列上有连接或 where 条件,那么索引该列将不会带来任何好处。您不想添加不必要的索引,因为它们会增加涉及该列的数据插入和更新的成本。
我们通常说 Sql Server 在查询中每个表实例只使用一个索引。因此,像“select * from people where firstname='Elroy' and lastname = 'Flynn'”这样的查询将最多使用一个索引,即使名字和姓氏都有索引。 SQL Server 将根据它从数据值中收集的统计信息选择一个或另一个索引。
为了完整起见,我必须在这里更进一步,讨论聚簇索引与非聚簇索引。一张表只能有一个聚集索引:其余的都是非聚集索引。尽管有上一段,当使用非聚集索引来解析查询时,索引查找会产生一个中间结果,该结果是与聚集索引(通常是主键)相关联的键的完整值。也就是说,每个非聚集索引的叶子都包含聚集键值,而不是行指针。找到这个聚簇键后,聚簇索引将用于解析对特定数据库行的查找。因此,最终,所有索引查找最终都会使用聚集索引。
不过,出于实际目的,通常说每个表实例只使用一个索引就足够了,也更简单。请注意,如果一个表在查询中使用了别名以致它出现不止一次,则可以为不同的引用使用不同的索引。例如,“select * from people p1 join people p2 on p1.firstname = p2.lastname”
可以在 p1 实例上使用名字索引,在 p2 实例上使用姓氏索引。
参见 http://msdn.microsoft.com/en-us/library/aa933131(v=SQL.80).aspx
关于sql表优化: primary and secondary indexes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8632742/
我是 MySQL 的新手,我在尝试找出如何解决以下问题时遇到了麻烦: 1 - 我有一个表格,其中包含一些人的数据,包括姓名、数字代码和每个人的类别。 假设“JOHN DOE”是其中之一,他的编号是“1
Secondary NameNode 失败时 hadoop 集群会发生什么。 Hadoop 集群被称为单点故障,因为所有元数据都由 NameNode 存储。 Secondary NameNode呢,如
我正在运行一个由 3 个成员(数据中心 A 中的成员 1、数据中心 B 中的成员 2 和成员 3)组成的传统 MongoDB 副本集。member1 是当前的 PRIMARY,我通过 rs.add()
这是我对 GTK 理解的延续:: 从 Main 的 pthread 下调用 GTK_MAIN() 是否正确?示例代码:: 从 main 我调用 dispInit(argc, argv); 我从 g
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: What does the second argument to $() mean? 有一段时间我使用 jQuery
这个问题在这里已经有了答案: Getting hold of the outer class object from the inner class object (7 个答案) 关闭 6 年前。
both 的文档几乎完全相同,所以我发现很难看出它们之间的区别。基于此Q&A ,唯一的区别是 [...] that checkpoint node can upload the new copy of
人们是否通常将表中的每一列都设为二级索引,以防万一客户决定使用任一字段来搜索记录? 搜索是否先通过二级索引,然后到主键?从而缩小到请求的数据? 如果您已经有一个主键列,那么使用二级索引有什么意义? 最
我是 Redis 新手。我在 Sentinel 上阅读了他们的文档和 Replication他们在其中讨论了副本如何尽可能地与主服务器保持同步,但如果主服务器在成功写入后发生故障,副本仍然有可能无法接
刚刚开始使用 Kotlin,您可以在其中拥有一个primary 构造函数和一个secondary/strong> 那些。这个问题听起来很简单,但我找不到答案(我已经阅读了文档中的“构造函数”部分) -
我正在尝试基于已经存在的数据结构(我无法修改并且它本身不是图形)构建图形数据结构。我想我对如何构建与图形本身有关的大部分结构有所了解,但现在我必须引用原始数据结构来获得一个小的“比较”功能,并且很难对
这有什么算法吗?例如 twitter.com zamg.ac.at 是顶级域名 和 pic.twitter.com 是二级域名 最佳答案 定义: 不,据我所知是这样的: 示例:pic.twitte
我正在使用 jQuery 循环访问文档中的某些元素。这些元素的类型为 与类 .input-row .一些元素也可以有一个二级类(例如 .input-area )。 我使用 $(".input-row"
我需要以编程方式设置辅助进度条颜色。 我只看到方法 ProgressBar.setProgressDrawable(drawable) 用于设置主色,但没有设置副色的方法。 我该怎么做? 最佳答案 P
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我创建了一个表,如下所示,其中包含 Em 的全局二级索引(代表电子邮件)。 TableName : "Users", KeySchema: [ { AttributeN
Flask-Nav 允许 dynamic construction ;但是,我不知道如何通过将字典或列表传递给构建导航栏的函数来做到这一点。 @nav.navigation def top_nav()
客户如何能够同时使用他们注册时使用的主要电子邮件地址以及次要电子邮件地址客户属性字段登录? (我创建了一个客户属性文本字段 secondary_email)。 假设它与 customerEntity
我想使用 GNU Make 的特殊目标 .SECONDARY 来指定在作为中间文件创建时不应删除特定模式规则的结果。 .PRECIOUS 适用于模式,但奇怪的是,不适用于 .SECONDARY。我不想
在我的 iPhone 应用程序中,我需要连接到网络服务器,因为这可能需要一些时间,我使用的线程如下: [NSThread detachNewThreadSelector:@selector(sendS
我是一名优秀的程序员,十分优秀!