假设我有一个包含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引擎。
答案 0 :(得分:0)
对于postgresql,答案是取决于。
查询优化器一直在进行,执行计划取决于表大小,where子句的选择性以及许多其他因素。
人们经常会发现:他们创建了一个索引,而不是在查询中使用它。原因:对于数据库而言,顺序扫描比访问索引更便宜,然后是数据。
查询优化是专用邮件列表的主题。
答案 1 :(得分:-1)
这是与sql相关的答案,并非特定于任何RDBMS。索引主要用于快速获取数据进/出内存(通过存储文件系统中数据位置的信息)。在(所有)数据被拉出后进行排序(通常),因此在订购/排序数据时,大多数情况下不会使用索引。因为它已经被从数据库中删除了。