【发布时间】:2012-04-22 12:49:29
【问题描述】:
基于这个问题Selecting NOT NULL columns from a table其中一位发帖人说
您不应该在生产中使用 SELECT *。
我的问题:我们真的不应该在生产服务器上的 mysql 查询中使用 Select * 吗?如果是,我们为什么不使用全选?
【问题讨论】:
基于这个问题Selecting NOT NULL columns from a table其中一位发帖人说
您不应该在生产中使用 SELECT *。
我的问题:我们真的不应该在生产服务器上的 mysql 查询中使用 Select * 吗?如果是,我们为什么不使用全选?
【问题讨论】:
请记住,您的数据库服务器不一定与查询数据库的程序位于同一台机器上。数据库服务器可能位于带宽有限的网络上;它甚至可以跨越半个地球。
SELECT * FROM table。SELECT * FROM table 请求所有列只会浪费一半的列。其他可能的原因,最好指定您想要的确切列:
正如@Konerak 提到的,命名您想要的列还可以确保结果中列的 order 相同,即使表架构发生变化(即在两列之间插入一列其他人。)如果您依赖 FirstName 作为结果的 [2]nd 元素,这一点很重要。
(注意:处理这个问题的一种更健壮和自记录的方法是要求您的数据库结果作为键值对列表,如 PHP 关联数组、Perl 哈希或 Python dict。那这样您就不需要使用数字来索引结果(name = result[2]) - 您可以使用列名:name = result["FirstName"]。)
【讨论】:
使用SELECT * 效率非常低,尤其是对于具有大量列的表。您应该只选择您需要的列。
除此之外,使用列名使查询更易于阅读和维护。
【讨论】:
SELECT * 或SELECT a,b,c 当一个表有三列时具有相同的性能。它只是不太面向未来,更容易出错。
SELECT * 效率低下的原因?我列出了一些原因,但我可能遗漏了一些。
大多数人确实建议不要在生产中使用 SELECT *,因为它往往会破坏事情。不过也有一些例外。
SELECT * 获取所有列 - 而大多数时候你不
都需要。这会导致 SQL 服务器发送的列多于
需要,这是一种浪费,并且会使系统变慢。SELECT *,以后添加列时,旧查询也会
选择这个新列,而通常它不需要它。命名
这些列明确阻止了这种情况。SELECT * 查询的人也倾向于抓取行
并使用列顺序来获取列 - 这会破坏你的代码
在现有色谱柱之间注入色谱柱。SELECT * 在修改表列顺序时可能表现不同。但也有例外,例如这样的陈述:
INSERT INTO table_history
SELECT * FROM table
这样的查询从表中获取行,并将它们插入到 table_history 中。如果您希望此查询在新行添加到表和 table_history 时继续工作,SELECT * 是要走的路。
【讨论】:
result["FirstName"]) 询问列而不是数字 (result[2])。
result['FirstName'] 显而易见,而 result[2] 则更难阅读。可能会有轻微的速度损失,但除非您正在编写 Facebook,否则您不必担心这一点。请记住,“程序首先是为人类阅读而编写的,只是偶尔为计算机执行。”