连接表上的索引是否用于多对多关系?

时间:2014-04-02 17:01:57

标签: mysql sql postgresql indexing many-to-many

假设我有一个包含3个表描述公交车时刻表的数据库:

journey
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| start        | time        | NO   |     | NULL    |                |
| end          | time        | NO   |     | NULL    |                |
| route_id     | int(11)     | NO   | MUL | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

operating_days
+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| id         | int(11) | NO   | PRI | NULL    | auto_increment |
| start_date | date    | NO   | MUL | NULL    |                |
| end_date   | date    | NO   |     | NULL    |                |
+------------+---------+------+-----+---------+----------------+

journey_operating_days
+---------------------+---------+------+-----+---------+----------------+
| Field               | Type    | Null | Key | Default | Extra          |
+---------------------+---------+------+-----+---------+----------------+
| id                  | int(11) | NO   | PRI | NULL    | auto_increment |
| journey_id          | int(11) | NO   | MUL | NULL    |                |
| operating_days_id   | int(11) | NO   | MUL | NULL    |                |
+---------------------+---------+------+-----+---------+----------------+

如果我对此数据库进行查询,请按journey选择journey.id并加入operating_days的所有相关字段并按operating_days.start_date排序,列operating_days.start_date上的索引可用于对它们进行排序,还是不能用于db引擎?

这涉及MySQL和/或PostgreSQL引擎。

2 个答案:

答案 0 :(得分:0)

对于postgresql,答案是取决于

查询优化器一直在进行,执行计划取决于表大小,where子句的选择性以及许多其他因素。

人们经常会发现:他们创建了一个索引,而不是在查询中使用它。原因:对于数据库而言,顺序扫描比访问索引更便宜,然后是数据。

查询优化是专用邮件列表的主题。

答案 1 :(得分:-1)

这是与sql相关的答案,并非特定于任何RDBMS。索引主要用于快速获取数据进/出内存(通过存储文件系统中数据位置的信息)。在(所有)数据被拉出后进行排序(通常),因此在订购/排序数据时,大多数情况下不会使用索引。因为它已经被从数据库中删除了。