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

17 浏览
0 Comments

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

我在很多例子中看到包含了"SELECT *"语句,即使明显不需要/不想要所有的列,甚至不需要任何数据。

好吧,这很方便。也许如果有人创建一个通用指南,试图简化事情会更好?

但是,如果我只想从一列中获取一条记录呢?是否在我想要主键还是不想要主键时有关 - SELECT * 是好的实践,还是只是懒惰/实用性的事情,实际上并不重要?

我举个例子:在很多关于"如何使用 EXISTS"的问题/例子中,我看到这样的解决方案:

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

为什么我要使用 *,当我明显不需要任何数据 - 我想要的只是检查是否在表中存在与 STATEMENT 匹配的记录,仅此而已。

那为什么我到处都看到"SELECT *"?真的,所有的博客、文章、指南中都只有"SELECT *",甚至没有提到其他解决方案。

我猜测,我应该选择主键以获得最佳性能,像这样:

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

我错了吗?

0
0 Comments

在编写应用程序代码时,使用select *是一个不好的做法。你希望应用程序明确指定它使用的列,并且不希望将不必要的数据返回给应用程序。

如果你在编写预计长时间运行的代码,比如定时作业,同样不建议使用select *,原因类似。

MySQL倾向于将子查询(尽管它在避免这种情况方面变得更好)。所以在MySQL中,在from子句中使用select *作为子查询(一个"派生表")的性能原因不推荐使用。而在其他数据库中,有更智能的编译器。

但对于日常查询编写,特别是在最外层的select中,select *select t.*是一个很方便的选择。

对于EXISTSNOT EXISTS,它们没有任何区别。我通常写:

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

EXISTSNOT EXISTS只是查找行的存在与否,而不考虑列中的值。因此,选择什么对性能没有影响。我使用SELECT 1是因为它很容易输入,并且我认为它清楚地传达了它需要的内容。

这完全说得通。非常感谢!

我认为重复的链接涵盖了所提问的问题。我花了5分钟多才找到它,谷歌没有很好地对其进行索引。

我编辑了我的问题主题 - 我想我的问题比其他问题更具体,但是我同意,在那里放一个链接以获取更多关于select *的一般数据是很好的。

0