创建视图或使用innerjoins?

时间:2013-08-26 11:59:13

标签: php mysql performance

我有一个规范化的数据库,外键/主键提供一个到多个数据库。

我计划使用PHP访问此数据库以进行基本的前端/后端显示。现在,我的问题来自这两个示例查询:

CREATE VIEW `view` AS
  SELECT
    functiondetails.Detail,
    functionnames.ID,
    functionnames.FunctionName,
    functionnames.Catogory
  FROM functiondetails
    INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID

SELECT
  functiondetails.Detail,
  functionnames.ID,
  functionnames.FunctionName,
  functionnames.Catogory
FROM functiondetails
  INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID

查询中没有错误,因为我已经两次都没有失败,但我的整体问题是:

如果我打算经常从我的数据库中引用很多信息。是不是更容易创建一个视图,然后使用新添加的信息一直更新,或者更好的做法是在我的实际php上进行第二次查询。例如:

$Query = $MySQli->prepare("
  SELECT
    functiondetails.Detail,
    functionnames.ID,
    functionnames.FunctionName,
    functionnames.Catogory
  FROM functiondetails
    INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID
")
$Query->execute();
$Results = $Query->fetch_results();
$Array = $Results->fetch_array(MYSQLI_ASSOC);

或者从我的视图中选择?

$Query = $MySQLi->prepare("SELECT * FROM `view`");
$Query->execute();
$Results = $Query->fetch_results();
$Array = $Results->fetch_array(MYSQLI_ASSOC);

那么哪一个用于查询我的数据库会更好?

5 个答案:

答案 0 :(得分:6)

Viewsabstraction layer,创建抽象层的通常原因是为您提供一种工具,让您的生活更轻松。

使用视图的一些重要优势包括:

  1. 安全
    您可以控制谁有权查看,而无需授予他们访问基础表的权限。

  2. <强>澄清
    通常,列标题不像它们那样具有描述性。视图允许您为返回的数据添加清晰度。

  3. <强>性能
    表现明智,观点不会对你产生负面影响。但是,由于MySQL不支持materialized views,您不会通过使用视图获得性能提升。

  4. 轻松编码
    视图可用于重用复杂查询,减少用户错误的空间。

  5. 易于管理
    只要表格架构发生变化,它就会让您的生活更轻松 例如,假设您有一个包含待售房屋的表格homes_for_sale,但稍后您决定要让该表格处理您目前有售的所有房屋,{{{ 1}}。显然,新表格的图式与第一张表格有很大不同。

    如果您从all_homes获得了大量查询,那么现在您必须浏览所有代码并更新所有查询。这将打开您的用户错误和管理噩梦。

    解决更改的更好方法是使用相同名称的视图替换表。该视图将返回与原始表完全相同的模式,即使实际模式已更改。然后,如果需要,您可以按照自己的进度浏览代码,并更新查询电话。

答案 1 :(得分:5)

您可能假设MySQL在某处存储了视图的结果,并且随着基础表中的数据更改而导致更新。 MySQL没有这样做。查询视图与运行查询完全相同。

但它甚至比运行裸SQL查询更糟糕,因为MySQL可能会在临时表中累积基本查询的结果,因此您可以在查询中使用更多SQL子句来查看视图。我说“可能”因为它因视图算法而异。

有关MySQL如何使用“合并”算法或“temptable”算法执行视图的说明,请参阅http://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html

如果你想要物化视图,有一个名为FlexViews的工具可以维护物化视图:

  

Flexviews是MySQL的物化视图实现。它包含一个简单的API,用于创建实体化视图并刷新它们。使用Flexviews的优点是可以逐步刷新实例化视图,也就是说,通过使用记录数据库表更改的特殊日志来有效地更新视图。 Flexviews包括创建和维护这些日志的工具。 Flexviews创建的视图包括对JOIN和所有主要聚合函数的支持。

答案 2 :(得分:4)

如果你是:

,最好是创建视图
  • 确定所需的列
  • 想要在其他地方重复使用您的视图
  • 你喜欢用抽象的方式编码。 (隐藏技术细节)
  • 需要通过创建索引来快速访问。
  • 对少数用户的特定访问权(点评来自评论)

答案 3 :(得分:4)

视图只是存储的文本查询。您可以对其应用WHERE和ORDER,执行计划将根据这些条款进行计算。我认为如果你想保持代码“干净”会很有用。 您需要记住的是,修改视图有点困难,因此如果您不太确定列,或者它会改变后者,请坚持查询。

关于表现是相同的!

祝你好运!

答案 4 :(得分:3)

性能方面,它们应该是相同的,但出于一些实际原因,这种观点会更好。

我更喜欢观看,因为它鼓励通过在一个地方更改它们来更好地重用和重构复杂查询,而不必在任何地方复制粘贴新版本,如果在多个地方使用查询。

对视图运行更新查询可能看起来更简洁,但请注意,有时您无法更新视图中属于不同基础表的多个列。因此,如果您必须更新2个不同的列,则必须运行两个不同的更新查询。

使用视图也很有意义,因为您将复杂的数据库逻辑卸载到它所属的数据库,而不是将其构建到应用程序代码中。

在使用视图的不利方面,如果您没有准备好数据库管理工具,那么设置可能会花费更长的时间。此外,如果您有很多观点,您可能需要提出一些方法来组织和记录所有观点。如果视图开始建立其他视图,这会变得更复杂。因此,您必须提前计划并维护依赖关系。