使用继承会提高类似查询的速度和可维护性吗?

时间:2015-05-08 18:05:43

标签: mysql sql inheritance mysql-workbench dashboard

以下是我的情况:

  1. 我在php仪表板上运行4个查询,显示异步数据。
  2. 所有4个查询在整个过程中同时并按需激发 一天。
  3. 每个查询加入3-5个表(应用唯一的地方 条件取决于查询。)
  4. 所有4个查询共享2个或3个相同的表...因此有很多 4个查询之间的重复代码。
  5. 每个表最多可包含6列,数亿行, 最多5gig数据
  6. 如果不依赖缓存,查询应在30秒内返回, 当他们可以使用缓存时,可以在几秒钟或更短的时间内完成
  7. 我的问题是:

    应用继承优化查询是否可行/有益?我可以有一个视图,它是对我所有4个主要查询所依赖的2-3个公共表的查询,然后有4个较小的查询只应用它们唯一的额外表格和条件?

    优点:

    1. 因为我可以更容易地维护查询 可以只更新一个视图而不是重复进行更改 在所有4个查询中
    2. 它可能会更快,因为一个存储过程/视图最终会成为 缓存大部分时间
    3. 缺点:

      1. 现在我不是运行4个查询,而是运行8 查询(因为每次运行调用视图/存储的查询时 你必须运行那个程序)
      2. 使用该视图可能会导致我为每个人提取大量额外数据 查询
      3. 以下是两个类似查询的示例:

        SELECT
            SUM(visitor_cart_items.quantity * (TRIM(REPLACE(visitor_cart_items.price, '$', '')) + 0.0)) 
        FROM
            (SELECT DISTINCT
                   visitor_cart_items.id,
                   visitor_cart_items.price,
                   visitor_cart_items.quantity
            FROM
                messages_sent
                JOIN session_guid ON session_guid.visitor_forms_id = messages_sent.visitor_forms_id
                JOIN session_guid sessions ON sessions.session_guid = session_guid.session_guid
                JOIN visitor_cart_items ON visitor_cart_items.cart_id = sessions.visitor_forms_id
        
            WHERE
                sessions.status_type_id = 1
                AND sessions.website_id = 7
                AND messages_sent.status_id = 1
                AND sessions.updated_timestamp BETWEEN '2015-05-01' AND '2015-05-08') visitor_cart_items;
        

        SELECT 
            COUNT(DISTINCT sessions.visitor_forms_id) all_saves
        FROM
            messages_sent
            JOIN session_guid ON session_guid.visitor_forms_id = messages_sent.visitor_forms_id
            JOIN session_guid sessions ON sessions.session_guid = session_guid.session_guid
            JOIN visitor_forms ON visitor_forms.id = sessions.visitor_forms_id
        WHERE
            sessions.status_type_id = 1
            AND sessions.website_id = 7
            AND visitor_forms.form_type_id = 1 #1 for forms, 2 for carts
            AND sessions.updated_timestamp BETWEEN '2015-05-01' AND '2015-05-08';
        

1 个答案:

答案 0 :(得分:0)

我的经验是尝试在数据库级别应用继承/ OO风格思维是一件非常糟糕的事情。

一般来说,更简单的视图往往是正常的...不同DBMS上的查询优化器擅长“煮沸”视图并为您提供良好的性能。

但是,当您变得更复杂并开始使用具有聚合函数,用户定义函数和其他勘误的视图来实现代码重用时,它通常会带来巨大的I / O和查询计划开销。我们走了那条路,不得不撕掉那些东西然后撤退。在我看来,这是不值得的。与可怕的查询计划相比,代码重复是一个更好的问题。