4

基于这里的这个问题Selecting NOT NULL columns from a table张贴者之一说

你不应该在生产中使用 SELECT * 。

我的问题:我们真的不应该在生产服务器上的 mysql 查询中使用 Select * 吗?如果是,为什么我们不应该使用全选?

4

3 回答 3

4

大多数人确实建议不要SELECT *在生产中使用,因为它往往会破坏事情。不过也有一些例外。

  • SELECT *获取所有列 - 而大多数时候您并不需要它们。这会导致 SQL 服务器发送比需要更多的列,这是一种浪费,并且会使系统变慢。
  • 使用SELECT *,当您稍后添加列时,旧查询也会选择此新列,而通常它不需要它。明确命名列可以防止这种情况。
  • 大多数编写SELECT *查询的人也倾向于抓取行并使用列顺序来获取列 - 一旦在现有列之间注入列,这将破坏您的代码。
  • 显式命名列还可以保证它们始终处于相同的顺序,而SELECT *在修改表列顺序时可能表现不同。

但也有例外,例如像这样的语句:

INSERT INTO table_history
SELECT * FROM table 

像这样的查询从表中获取行,并将它们插入到 table_history 中。如果您希望此查询在将新行添加到表和 table_history 时继续工作,这SELECT *是可行的方法。

于 2012-04-10T08:08:43.427 回答
4

请记住,您的数据库服务器不一定与查询数据库的程序位于同一台机器上。数据库服务器可能位于带宽有限的网络上;它甚至可以跨越半个地球。

  • 如果您确实需要每一列,那么请务必使用SELECT * FROM table.
  • SELECT * FROM table但是,如果您只需要某些列,那么仅使用丢弃一半的列来请求所有列会浪费带宽。

其他可能的原因最好指定您想要的确切列:

  • 数据库结构可能会改变。例如,如果您的程序假定某些列名,那么如果列名更改,它可能会失败。如果违反您对列名的假设,显式命名要检索的列将使程序立即失败。
  • 正如@Konerak 提到的,命名您想要的列还可以确保结果中列的顺序是相同的,即使表架构发生变化(即在其他两列之间插入一列)。如果您是取决于FirstName是结果的第[2]nd 元素。

    (注意:处理这个问题的一种更健壮和自我记录的方法是要求您的数据库结果作为键值对列表,如 PHP 关联数组、Perl 哈希或 Python dict。这样您就不需要使用用于索引结果的数字 ( name = result[2]) - 您可以使用列名:name = result["FirstName"].)

于 2012-04-10T08:12:02.137 回答
0

使用SELECT *效率非常低,尤其是对于有很多列的表。您应该只选择您需要的列。

除此之外,使用列名使查询更易于阅读和维护。

于 2012-04-10T08:10:12.643 回答