mysql - 在这种情况下,数据库有更好的内连接以提高性能

标签 mysql database database-design

我有两个表来管理做各种事情所花费的时间:

@times(id, time_in_minutes)
@times_intervals(id, times_id, time_in_minutes, start, end)

那么@times可能与不同的事物相关:

@tasks(id, description)
@products(id, description, serial_number, year)

@task@products<重用相同的@times@times_intervals的最佳实践是什么/强>?

我会考虑:

@times(+task_id, +product_id) 
// add task_id and product_id to the original @times table

但是如果我这样做,当我将 @times 表与 @task@products 表加入时会变慢,因为应在 2 个(task_idproduct_id)之间进行选择。当task_id不为空时,加入@tasks,反之亦然。

(我使用的是MySQL6)

非常感谢

最佳答案

我会从时间表中删除 time_in_months 列。如果这些信息只是细节的总和,那么它就是多余的,并且是不成熟的优化。

我将添加一个包含product_id、times_id的product_time表和一个包含task_id、time_id的task_time表

然后获取产品的总时间:

SELECT *
FROM product p
INNER JOIN product_time pt
    ON pt.product_id = p.id
INNER JOIN (
    SELECT times_id, SUM(time_in_minutes) as time_in_minutes
    FROM times_intervals
    GROUP BY times_id
) AS t
    ON t.times_id = pt.times_id

通常要执行此操作,您需要为 times_intervals 建立一个非聚集覆盖索引,其中包含 times_id 和 time_in_ 分钟 - 请注意,此时时间表只是一个无数据的 header 表,其唯一目的是对时间进行分组times_intervals ,它是必需的,因为您的任务安排非常相似。

如果没有两个(或更多)实体使用 times_intervals,您可以简单地将 Product_id 放入 times_intervals 中并将其视为您的 header /主 ID。

关于mysql - 在这种情况下,数据库有更好的内连接以提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6777338/

相关文章:

一张表有两个外键的MySQL数据库

php - mysqli 将结果作为关联数组获取

sql - 按名称查找存储过程

mysql - 友谊数据库模式

mysql - SQL Server 和 MySql 中的密码限制

mysql查询不同的meta_key并分别显示

node.js - 存储历史数据的最佳方法?

mysql - 请求多个复选框项目时如何设置 Rails 表单?

sql - 选择哪种数据库结构?

sql - 如何将一个表与另一个表关联起来以备将来记录