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

MySql查询:真的不使用SELECT*?

  •  1
  • Francesco  · 技术社区  · 16 年前

    我是一个自学成才的开发人员,总是被告知不要使用SELECT*,但我的大多数查询都需要知道某一行的所有值。。。

    那我应该用什么?我应该每次都列出所有的属性吗?像选择elem1,elem2,elem3,…,elem15 FROM。。。?

    8 回复  |  直到 16 年前
        1
  •  3
  •   Vasilis Lourdas    16 年前

    选择*自。。。除非需要所有列,否则并不总是最好的方法。这是因为,例如,如果一个表有10列,而您只需要其中的2-3列,并且这些列被编入了索引,那么如果您使用SELECT*查询将运行得较慢,因为服务器必须从数据文件中获取所有行。如果只使用实际需要的2-3列,那么如果行是从覆盖索引中提取的,那么服务器可以更快地运行查询。覆盖索引是用于返回结果而不读取数据文件的索引。

    因此,只有在实际需要所有列时才使用SELECT*。

        2
  •  4
  •   Nick H    16 年前

    如果您真的需要所有的列,并且要按名称获取结果,我会继续使用 SELECT * . 如果您是按索引获取行结果,那么指定列名是有意义的,否则它们可能不符合您期望的顺序(尤其是在表架构发生更改时)。

        3
  •  2
  •   mechanical_meat nazca    16 年前

    * ,尝试将其限制为特定的表;例如:

    SELECT t.*
      FROM mytable t
    
        4
  •  1
  •   OMG Ponies    16 年前

    SELECT t.elem1,
           t.elem2
      FROM YOUR_TABLE t
    

    表别名的存在有助于演示什么是列(以及它来自何处)和派生列。

        5
  •  1
  •   aeq    16 年前

    总是 需要所有的专栏吗 select * 应该没问题。但我避免这种情况的理由是:假设另一个开发人员将另一列添加到表中,而您的查询不需要该列,那么就有了开销。当添加更多的列时,情况会变得更糟。

        6
  •  0
  •   Matt    16 年前

    唯一真正的性能打击你从使用 select * 如果不需要,则返回结果集中的额外列所需的带宽。除此之外,使用 .

        7
  •  0
  •   Hammerite    16 年前

    SELECT * 从子查询。

        8
  •  0
  •   Guy Gordon    16 年前

    是,选择*不正确。您没有说明要使用什么语言来处理返回的数据。假设您将这些记录作为数组(而不是哈希映射)接收回来。在这种情况下,第[12]行是什么?也许你写应用程序的时候是ZipCode,但是猜猜看如果有人在ZipCode之前插入一个字段SuiteNumber会发生什么。

    或者假设下一个编码器将一个巨大的blob字段附加到每个记录。哎哟!

    Select*牺牲了可维护性,以节省一点输入。