【发布时间】:2012-08-12 10:30:21
【问题描述】:
关于数据库索引如何工作的一个简单问题。
假设我有一个表 'Student',其中包含 id(primary_key)、name 和 GPA 列。假设我在 id 和其他列上没有索引
现在,如果我使用名称和 GPA(不使用 id)查询记录,它必须搜索所有记录以查找匹配项。这里索引有什么好处?
索引是否只有在查询包含索引列时才有效?
【问题讨论】:
标签: database indexing database-indexes
关于数据库索引如何工作的一个简单问题。
假设我有一个表 'Student',其中包含 id(primary_key)、name 和 GPA 列。假设我在 id 和其他列上没有索引
现在,如果我使用名称和 GPA(不使用 id)查询记录,它必须搜索所有记录以查找匹配项。这里索引有什么好处?
索引是否只有在查询包含索引列时才有效?
【问题讨论】:
标签: database indexing database-indexes
如果我使用名称和 GPA(不使用 id)查询记录,它必须搜索所有记录以查找匹配项。这里索引有什么好处?
你是对的。没有任何优势,除了唯一索引也可以强制唯一性
索引是否只有在查询包含索引列时才有效?
对于查找匹配的行基本上是肯定的,尽管如果order by 包含索引列,也可以使用索引来帮助排序
【讨论】:
只是为 Bohemian 的答案添加一些示例(并假设是 SQL RDBMS):
Student(name) 上的索引 IX1 将有利于以下查询:
SELECT * FROM Student WHERE name = 'Bloggs';
同样,你需要一个索引,比如学生(GPA)上的 IX2
SELECT * FROM Student WHERE GPA between 1 and 2;
如果您同时拥有上述索引 IX1 和 IX2,则 SQL 将在以下查询中“选择”两者之一:
SELECT * FROM Student WHERE name = 'Bloggs' and GPA between 1 and 2;
仅使用索引中的字段的查询可以完全由索引提供服务(即,不需要 SQL 在内部“加入”回表或集群)。例如以下将完全由 IX1 提供服务,因为名称在索引中。
SELECT name FROM Student WHERE name = 'Bloggs';
索引中必须有良好的“选择性”,SQL 才能使用索引。例如如果您的数据库中的每个人都有一个名称“博客”,那么 SQL 很可能会绕过索引并改为扫描表。
【讨论】: