【问题标题】:Are indexes on the join table used in many-to-many relationships?连接表上的索引是否用于多对多关系?
【发布时间】:2014-04-02 17:01:57
【问题描述】:

假设我有一个数据库,其中包含 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 by journey.id 并加入来自operating_days 的所有相关字段并按operating_days.start_date 排序,那么列operating_days.start_date 上的索引会是用于订购它们还是无法用于 db 引擎?

这与 MySQL 和/或 PostgreSQL 引擎有关。

【问题讨论】:

  • 很难说,因为这取决于;哪个 RDBMS(MySQL 与 PostgreSQL),每个的 version,每个表中有多少行,实际查询是什么(连接条件,WHERE 子句中的条件,@ 中的数据987654328@...),系统上正在运行哪些其他查询,一些物理存储现实...一般来说,索引开始operating_days.start_date(然后是其中之一ids) 对某些查询很有用。

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


【解决方案1】:

对于 postgresql,答案是取决于

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

人们经常发现:他们创建了一个索引,但它并没有在查询中使用。原因:对数据库来说,顺序扫描比访问索引再访问数据更便宜。

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

【讨论】:

    【解决方案2】:

    这是一个与 sql 相关的答案,并非特定于任何 RDBMS。索引主要用于快速将数据移入/移出内存(通过存储有关文件系统中数据位置的信息)。排序(通常)发生在所有数据被提取之后,因此在大多数情况下,当您对数据进行排序/排序时,不会使用索引。因为它已经从数据库中提取出来了。

    【讨论】:

    • 通常,如果我在operating_days.start_dateoperating_days.end_date 上有一个复合索引并且有一个查询SELECT * FROM operating_days WHERE start_date = 2014-01-01 ORDER BY end_date,它会使用该索引在MySQL 和PostgreSQL 中按end_date 对提取的条目进行排序。跨度>
    • -1 - 错误。优化器可以(并且在可能的情况下这样做)使用索引进行排序(和分组,以及一堆其他事情)。这在一定程度上取决于哪个 RDBMS,但几乎所有 RDBMS 都可以/将会(不同的只是在不同程度上使用它们)。
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2016-02-18
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多