MySQL 指定查询中的每一列,而不是使用 SELECT * [重复]
Posted
技术标签:
【中文标题】MySQL 指定查询中的每一列,而不是使用 SELECT * [重复]【英文标题】:MySQL specify every column in query rather than using SELECT * [duplicate] 【发布时间】:2012-06-15 08:07:55 【问题描述】:可能重复:Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc
我记得几年前读过,在你想从 mysql 表中选择 所有内容 的场景中,指定每一列而不是使用惰性和更少的列是更有效和更好的做法- 高效的SELECT *
方法。
我很难在网上找到任何证据,所以我不确定它是否适用于较新版本的 MySQL 和 php。
指定SELECT
中的每一列而不是使用SELECT *
会更好吗?
SELECT * FROM golf_course WHERE id = 2;
【问题讨论】:
【参考方案1】:Select * 本质上效率较低,因为数据库必须查找列。此外,如果您甚至有一个连接,您就会发送不必要的重复数据,这会浪费数据库和网络资源,特别是如果您在每个查询上都这样做。最后, select * 没有指定列的顺序,所以如果有人愚蠢地删除并重新创建了具有不同顺序的列的表,您可能会突然在表单上的名字列中显示您的社会安全号码或报告。如果有人添加了一个您不想随处显示的列(例如出于审计目的或您不希望客户看到的有关客户的注释),那么您就有麻烦了。此外,如果您确实添加了列,则需要确定它们应该出现在哪里,以及为什么不让它们随意出现在任何地方。 Select * 是一个非常糟糕的 SQL 反模式。
【讨论】:
【参考方案2】:是的。
您的查询会更容易理解 您将只选择您需要的列 如果您指定了所有列,则以后删除不需要的那些会更容易,但如果您不这样做并且以后想删除,则需要输入所有列 您将能够以您想要的方式排列列并在代码中引用它们,即使稍后将更多列添加到表中 您可以轻松添加计算、连接 等等性能方面,我不确定
【讨论】:
另外,未定义列顺序。对表格的更改(添加)会影响您的代码。 显然让代码易于理解是一个问题,但我更关心性能。如果我的代码库中有 许多 个SELECT *
实例,这将影响我的应用程序的性能。我知道这不是一个好习惯,但我正在处理遗留代码,当然我不会编写 SELECT *
查询并将其转储到一些 PHP 中。
@Randy 我以前的印象是好处会更多地与性能相关?以这种方式构建基本查询是否有任何性能提升?
只有当它是基于列的存储引擎时,性能才会有所不同。在基于行的存储引擎中,它仍然从磁盘读取整行。
我认为查找列列表的开销将是最小的——如果你实际上使用了结果集中的所有列,那么返回的内容没有区别——但是:只要你不需要一列,无论如何您都需要支付更多费用才能检索它【参考方案3】:
恕我直言,调用SELECT *
将必须读取仅调用所需字段的所有字段将更有效。当您查询更大的数据库时,使用SELECT *
可能会影响性能
【讨论】:
是的,很明显,如果您在 tableX 中有 10 个字段并且只需要 5 个,那么您指定 5 个。但我的问题是,如果您有 10 个字段并且您需要 10 个 - 您应该指定 10 个还是只指定SELECT *
?
SELECT *
适合这种情况。
@marcus,不,不会,select * 不应该在生产查询中使用,它是一个 SQl 反模式。数据库仍然需要浪费时间查找列。以上是关于MySQL 指定查询中的每一列,而不是使用 SELECT * [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Power Queries 为另一个查询的每一列合并/添加文件中的行
pyodbc/sqlalchemy - 使用 pd.read_sql_query 读取表中的每一列。通过查询传递变量