Database design 何时使用多级索引

Database design 何时使用多级索引,database-design,indexing,schema,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) 可以对行数

我想知道在数据库系统中,在什么情况下最好使用多级索引或任何索引。如果以以下模式为例:

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)

可以对行数和访问类型进行假设。我只想知道什么时候使用一级索引而不是多级索引或二级索引是正确的。

首先,对术语进行一点澄清

主索引只是主键下的索引。二级索引是任何其他索引。因此,这与“简单”与“复合”(又名“复合”或你所说的“多级”)指数是正交的:主指数可能是复合指数,也可能不是复合指数,次指数可能是复合指数,也可能不是复合指数


要回答你的问题

取决于数据库结构(PKs、FKs和群集)和要运行的查询

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

  • Course\u模块{Course\u code,module\u code}
    上可能会有一个复合索引,以支持其主键
  • 课程模块{module\u code}
    上可能会有一个索引来支持FK
  • 如果您希望(也称为“索引组织”)基于
    course\u leader
    的课程,将在
    {course\u leader}
    1上有一个聚类索引
  • 等等,等等
查询需求可能意味着:

  • 如果您希望查找具有给定
    课程名称的课程
    ,则只需要
    {course\u name}
    上的索引(以获得良好的性能)
  • 如果您希望查找具有给定
    course\u name
    course\u leader
    的课程,则需要在
    {course\u name,course\u leader}
    上建立一个复合索引
  • <> LI>如果您希望获得属于给定的代码>课程领导/代码>的课程,您将需要一个索引:<代码> {课程}领导} /代码>,但是如果您的选择列表只包含“代码>课程名称>代码>,您可以考虑使用复合索引<代码> {课程领导,课程名称}//>代码> 。
  • 等等,等等
每个附加索引都会降低插入/更新/删除的性能,因此索引设计是读写性能之间的平衡

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



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

感谢您的回答,它已经基本澄清了这一点,关于复合索引的一点是它们与多级索引不同吗?这是我对多级索引的解释,似乎是复合索引different@user2358161好啊这是一个多级B-树。作为从“外部”访问DBMS的人,您不能直接控制B树需要多少层来存储所有必要的值。同一索引可能在某一时间是单级B-树,而在另一时间是多级B-树。