关于数据库索引如何工作的一个简单问题。
假设我有一个表 'Student' 列 id(primary_key)、name 和 GPA。假设我在 id 和其他列上没有索引
现在,如果我使用名称和 GPA(不使用 id)查询记录,它必须搜索所有记录以查找匹配项。索引在这里有什么好处?
索引是否仅在查询包含索引列时才有效?
关于数据库索引如何工作的一个简单问题。
假设我有一个表 'Student' 列 id(primary_key)、name 和 GPA。假设我在 id 和其他列上没有索引
现在,如果我使用名称和 GPA(不使用 id)查询记录,它必须搜索所有记录以查找匹配项。索引在这里有什么好处?
索引是否仅在查询包含索引列时才有效?
如果我使用名称和 GPA(不带 id)查询记录,它必须搜索所有记录以查找匹配项。索引在这里有什么好处?
你是对的。没有任何优势,除了唯一索引也可以强制唯一性
索引是否仅在查询包含索引列时才有效?
基本上可以用于查找order by
匹配的行,尽管如果包含索引列,索引也可用于帮助排序
只是为 Bohemian 的答案添加一些示例(并假设使用 SQL RDBMS):
Student(name) 上的索引 IX1 将有利于以下查询:
SELECT * FROM Student WHERE name = 'Bloggs';
同样,您需要一个索引,例如 Student(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 才能使用该索引。例如,如果您的数据库中的每个人都有一个名称“Bloggs”,那么 SQL 很可能会绕过索引并改为扫描表。