代码之家  ›  专栏  ›  技术社区  ›  pestaa

查询主键真的值得吗?

  •  2
  • pestaa  · 技术社区  · 15 年前

    Jeff Atwood wrote once 他发现查询数据库中的主键,然后用in子句获取所有相关字段的速度是它的单个SQL对应项的两倍。

    我想知道这是否适用于所有情况,如果不适用,在性能方面仍然提供显著改进空间的情况是什么?

    此外,通过脚本语言库访问数据库的成本是多少?我主要讲的是非常著名的php-mysql组合。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Tim Martin    15 年前

    Jeff Atwood正在谈论的是SQL Server,而不是MySQL。众所周知,SQL优化依赖于DBMS、配置、查询、数据和缓存的状态。除了说只选择主关键字字段至少和选择整行一样快之外,很难概括。当然,很难在任何程度上概括出有用的东西。你必须以你的具体案件为基准。

    根据我对MySQL的经验,如果用in-query选择细节比使用 SELECT * 首先。我的理解是 选择* 比…贵 SELECT id 因为在这两种情况下,MySQL都必须查找索引数据,但在前一种情况下,必须执行额外的步骤来获取构成行其余部分的数据,这可能需要进一步的磁盘查找(尤其是因为表数据比索引更不可能位于缓存中)。但是,对于InnoDB聚集索引(如果使用InnoDB,则主键为),有一种特殊情况,即数据存储在聚集索引的索引项旁边。在这种情况下,我相信 选择* 速度几乎与 选择ID .

        2
  •  3
  •   James McNellis    15 年前

    视情况而定。有时候,正如杰夫的博客文章清楚地表明的那样,它可以提供(显著的)性能提升。但是作为一般规则,最好让查询优化器找到它能找到的最佳执行计划,然后尝试手动优化速度特别慢的查询。

    在本文中,“我们默认使用内置的LINQ语言构造,并在性能跟踪告诉我们需要手动调优的地方下拉到手动调优旧的SQL blobs。”同样,您应该默认使用查询优化器执行它的操作,并下拉到手动调优性能跟踪告诉您需要调优的SQL语句。

    从脚本语言连接到数据库引擎通常非常快。通常,查询的实际执行时间要比实际连接到数据库服务器并将结果从数据库服务器移回请求脚本所花费的时间长得多。

        3
  •  0
  •   Michael Todd    15 年前

    从表中获取数据时,通过键检索数据总是更快的。这只是数据库的工作方式;获取索引数据比获取非索引数据更快。并且得到 只有 由于数据库引擎所要做的就是“展开”索引中的数据到结果集中,所以这个键可以更快。

    至于你的“昂贵”问题,我假设你的意思是“它慢吗”。我还没发现是这样。从计算的角度来看,最昂贵的一个查询部分是打开连接,而大多数(如果不是全部)现代数据库使用某种形式的连接缓存,因此它不再那么昂贵了。至于查询本身,唯一真正的开销将是网络延迟,因此您应该看到查询所花费的时间大约与使用非脚本语言(换句话说,毫秒)进行查询所花费的时间相同,或者不会比使用非脚本语言进行查询所花费的时间长得多。