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 * [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl Excel 循环遍历单列而不是每一列

Power Queries 为另一个查询的每一列合并/添加文件中的行

pyodbc/sqlalchemy - 使用 pd.read_sql_query 读取表中的每一列。通过查询传递变量

数据库的三大范式和五大约束(转)

我想请教你 我想实现 点击全选的时候 dev控件GridControl 中的每一列都被选中 并且我如何获取是不是选中

Mysql数据库索引简介