首页 > 解决方案 > 如果我不需要任何数据,SELECT * 是一个好习惯吗?

问题描述

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

好的,它很方便。也许如果有人创建一个通用指南只是试图让事情变得简单?

但是,如果我确实想从一列中获取一条记录怎么办?我是否想要主键是否重要 - SELECT * 是好的做法,还是只是懒惰/实用的东西,真的无关紧要?

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

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

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

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

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

我错了吗?

标签: mysqlsqlperformancequery-optimization

解决方案


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

如果您正在编写您希望随着时间的推移运行的代码(例如作为计划作业),那么select *出于类似原因也不建议您这样做。

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

但是对于日常查询写作,尤其是在最外层selectselect *还是select t.*非常方便的。

对于EXISTSNOT EXISTS,它根本没有区别。我通常写:

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

EXISTS并且NOT EXISTS只寻找行的存在,而不是列中的值。因此,选择的内容应该对性能没有影响。我使用SELECT 1它是因为它很容易打字,而且我认为它很清楚地传达了它需要什么。


推荐阅读