创建视图或使用innerjoins?

Dar*_*ill 12 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
Run Code Online (Sandbox Code Playgroud)

要么

SELECT
  functiondetails.Detail,
  functionnames.ID,
  functionnames.FunctionName,
  functionnames.Catogory
FROM functiondetails
  INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID
Run Code Online (Sandbox Code Playgroud)

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

如果我打算经常从我的数据库中引用很多信息.是不是更容易创建一个视图,然后使用新添加的信息一直更新,或者更好的做法是在我的实际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);
Run Code Online (Sandbox Code Playgroud)

或者从我的视图中选择?

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

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

Mic*_*yen 6

视图是一个抽象层,创建抽象层的通常原因是为您提供一种工具,使您的生活更轻松.

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

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

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

  3. 性能
    表现明智,观点不会对您产生负面影响.但是,由于MySQL不支持物化视图,因此您不会通过使用视图来获得性能提升.

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

  5. 易于管理
    只要表格架构发生变化,您的生活就会变得更轻松.

    例如,假设你有一个包含你有待售房屋的表,homes_for_sale但后来你决定要该表来处理你曾经出售所有家庭/对目前出售all_homes.显然,新表的模式与第一个模式有很大不同.

    如果您有大量的查询homes_for_sale,现在您必须浏览所有代码并更新所有查询.这将打开您的用户错误和管理噩梦.

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


jac*_*ill 5

如果满足以下条件,则最好创建视图:

  • 确定必填列
  • 也想在其他地方重用您的视图
  • 您喜欢以抽象方式进行编码。(隐藏技术细节)
  • 需要通过在其上创建索引来快速访问。
  • 对少数用户的特定访问权限(观点摘自注释)

  • 除非有什么变化,而我不知道这件事,否则您无法在MySQL的视图上创建索引。您可以使用MSSQL等中的实例化视图来实现。 (2认同)

Bil*_*win 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和所有主要聚合函数的支持.