如果我不需要任何数据,SELECT *是一种好的做法吗?

时间:2019-01-12 13:35:53

标签: mysql sql performance query-optimization

我在许多示例中都看到包含“ SELECT *”语句,即使显然不是所有列,甚至也不是必需/不需要的数据。

好,很方便。也许如果有人创建了通用指南只是想使事情变得简单?

但是,如果我只想从一列中获得一条记录,该怎么办?是否要使用主键有关系吗-SELECT *是好的做法,还是只是懒惰/实际的事情都没关系?

我举一个例子:在“如何使用“ EXISTS”的许多问题/例子中,我看到了这样的解决方案:

(...) AND EXISTS (SELECT * FROM `table` WHERE ~~STATEMENT~~)

当我完全不需要任何数据时,为什么我应该使用*-我所要做的就是检查表中是否存在与STATEMENT相匹配的记录,仅此而已。 那么,为什么到处都看到“ SELECT *”?从字面上看,在所有博客,文章和指南中,我都看到“ SELECT *”,甚至没人提到任何其他解决方案。

我的猜测是,我应该只选择主键以获得最佳性能,例如:

(...) AND EXISTS (SELECT `primary_key_column` FROM `table` WHERE ~~STATEMENT~~)

我错了吗?

1 个答案:

答案 0 :(得分:2)

如果您正在编写应用程序代码,那么select *是一个不好的做法。您希望应用程序具体说明它正在使用的列。而且您不想将不必要的数据返回给应用程序。

如果您正在编写希望随着时间的流逝运行的代码(例如,作为预定作业),则出于类似原因,也不建议使用select *

MySQL倾向于实现子查询(尽管在避免这种情况方面会变得更好)。因此,在MySQL中,出于性能原因,不建议在select *子句(“派生表”)的子查询中使用from。在其他具有更智能编译器的数据库中,情况并非如此。

但是对于日常查询编写,尤其是最外面的selectselect *select t.*来说,这是非常方便的。

对于EXISTSNOT EXISTS,这毫无区别。我通常写:

EXISTS (SELECT 1 FROM `table` WHERE ~~STATEMENT~~)

EXISTSNOT EXISTS仅在寻找行的存在,而不在寻找列中的值。因此,选择的内容应该不会对性能造成任何影响。我使用SELECT 1是因为它易于输入,而且我认为可以很清楚地传达出它的要求。