何时使用多级索引

时间:2013-05-07 11:48:53

标签: database-design indexing schema

我想知道在数据库系统方面哪种情况最好使用多级索引或任何索引。如果我有以下架构作为示例:

Course (course_code, course_name, course_leader)
Module (module_code, module_name, module_leader, semester)
Course_module (course_code, module_code)
Lecturer (employee_id, employee_name, email, phone)

可以对行数和访问类型进行假设。我只想知道何时使用主索引而不是多级索引或二级索引等。

1 个答案:

答案 0 :(得分:1)

首先是一个轻微的术语澄清......

主索引只是主键下的索引。二级索引是任何其他索引。因此,这与“简单”与“复合”(又称“复合”或所谓的“多级”)索引正交:主索引可能是也可能不是复合索引,辅助索引可能是复合的,也可能不是复合索引。


回答你的问题...

取决于您打算运行的数据库结构(PK,FK和群集)和查询。

例如,数据库结构可能意味着:

  • Course_module {course_code, module_code}上可能会有一个综合索引,以支持其PK。
  • Course_module {module_code}可能会有一个索引支持FK。
  • 如果您希望cluster(又称“索引组织”)基于course_leader的课程,{course_leader} 1
  • Etc等...

查询需求可能意味着:

  • 如果您希望查找给定course_name的课程,则只需要{course_name}上的索引(以获得良好的效果)。
  • 如果您希望找到包含course_namecourse_leader的课程,则需要{course_name, course_leader}上的综合索引。
  • 如果您希望获得属于给定course_leader的课程,则需要{course_leader}上的索引,但如果您的SELECT列表仅包含course_name,您可能会考虑{{ 3}}具有复合索引{course_leader, course_name}的查询。
  • Etc等...

每个附加索引都会降低INSERT / UPDATE / DELETE的性能,因此索引设计是读写性能之间的平衡。

所有这些都源于B树的结构以及它们如何用于满足各种数据库操作。这个主题的完整处理超出了任何单个StackOverflow答案的范围,但如果您有兴趣,我热烈建议从头到尾阅读:covering


1 有些DBMS根本不支持群集,大多数群集确实需要群集密钥等于PK。 MS SQL Server是一个值得注意的例外 - 您可以将数据集中在与PK不同的密钥上。