【问题标题】:MySQL SELECT efficiencyMySQL SELECT 效率
【发布时间】:2010-08-02 03:57:55
【问题描述】:

我正在使用 PHP 与 MySQL 数据库进行交互,我想知道使用“SELECT * FROM...”查询 MySQL 是否比“SELECT id FROM...”更有效。

【问题讨论】:

  • 反对票是怎么回事?如果是骗子,让 cmets 这么说。
  • 为什么是php?该效率问题是否取决于查询所使用的接口?

标签: mysql select performance


【解决方案1】:

效率较低。

如果您考虑一下,SQL 将发送您选择的每一行的所有数据。

假设您有一个名为 MassiveTextBlock 的列 - 当您 SELECT * 时将包含此列,因此当您实际上可能不需要它时,SQL 将不得不发送所有这些数据。相比之下,SELECT id 只是抓取一个数字集合。

【讨论】:

  • 好吧,我不知道它发送信息是否比排序和选择正确的行更糟糕。谢谢。
  • @Graphain:我们还应该记住,提出此类问题的人对性能一无所知,甚至 SELECT id(而不是 *)也无助于提高无索引表和使用索引的性能LIKE '%bla%' 条件 ;-)
  • @zerkms:不确定这与@Graphain 的回答有什么关系。
  • >> 比排序并选择正确的行。 - 什么是对的”? “对”为谁?数据库不知道你需要哪些列。
  • @musicfreak:这是对他的好答案的补充,新手不应该考虑像 SELECT * 这样的“微不足道”的性能“麻烦”;-)
【解决方案2】:

它的效率较低,因为您获取的信息比 SELECT id 多得多。此外,第二个问题更有可能仅使用索引来解决。

【讨论】:

    【解决方案3】:

    这取决于您选择数据的原因。如果您正在编写像 phpMySQL 这样的原始数据库接口,那么它可能是有意义的。

    如果您使用相同的条件和连接操作对同一个表执行多个查询,那么 SELECT col1, col2 FROM table 可能比使用两个独立的 SELECT col1 FROM tableSELECT col2 FROM table 来获取不同部分更有意义相同的数据,因为这会在同一个查询中执行这两个操作。

    但是,一般来说,您应该只从表中选择您需要的列,以尽量减少不必要的数据被 DBMS 挖出。如果您的数据库与客户端服务器位于不同的服务器上,或者如果您的数据库服务器较旧和/或速度较慢,则此方法的好处会大大增加。

    没有任何情况下SELECT * 是不可避免的,但如果有,那么您的数据模型可能存在一些严重的设计缺陷。

    【讨论】:

      【解决方案4】:

      这取决于您的索引。

      如果只选择 MySQL 用来获取结果的索引中存在的列,则选择较少的列有时可以节省大量时间。

      例如,如果您在列id 上有一个索引,并且您执行此查询:

      SELECT id FROM mytable WHERE id>5
      

      那么MySQL只需要读取索引,甚至不需要读取表行。另一方面,如果您选择其他列,例如:

      SELECT id, name FROM mytable WHERE id>5
      

      那么MySQL就需要从索引中读取id,然后去表行读取name列。

      但是,如果您正在读取不在您选择的索引中的列,那么读取更多列实际上不会产生几乎一样大的差异,尽管它会产生很小的差异。如果某些列包含大量数据,例如大的 TEXT 或 BLOB 列,那么如果您不需要它们,最好将它们排除在外。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-10
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 2010-11-29
        • 2011-02-26
        • 2012-04-12
        相关资源
        最近更新 更多