mysql - 如果我不需要任何数据,SELECT * 是一个好习惯吗?
问题描述
我在许多包含“SELECT *”语句的示例中看到,即使显然不是所有列,甚至任何数据都是必需的/想要的。
好的,它很方便。也许如果有人创建一个通用指南只是试图让事情变得简单?
但是,如果我确实想从一列中获取一条记录怎么办?我是否想要主键是否重要 - SELECT * 是好的做法,还是只是懒惰/实用的东西,真的无关紧要?
我举个例子:在“如何使用”EXISTS“的许多问题/例子中,我看到了这样一个解决方案:
(...) AND EXISTS (SELECT * FROM `table` WHERE ~~STATEMENT~~)
为什么我应该使用 *,当我显然根本不需要任何数据时 - 我想要的只是检查表中是否存在与 STATEMENT 匹配的记录,仅此而已。那么为什么我到处都能看到“SELECT *”呢?从字面上看,在所有博客、文章、指南中,我都看到“SELECT *”,甚至没有人提到任何其他解决方案。
我的猜测是,我应该选择主键以获得最佳性能,如下所示:
(...) AND EXISTS (SELECT `primary_key_column` FROM `table` WHERE ~~STATEMENT~~)
我错了吗?
解决方案
如果您正在编写应用程序代码,那么select *
这是一种糟糕的做法。您希望应用程序具体说明它正在使用的列。而且您不想将不必要的数据返回给应用程序。
如果您正在编写您希望随着时间的推移运行的代码(例如作为计划作业),那么select *
出于类似原因也不建议您这样做。
MySQL 倾向于实现子查询(尽管它在避免这种情况方面做得更好)。因此在 MySQL 中,出于性能原因,不建议select *
在子句中使用子查询(“派生表”)。from
在其他具有更智能编译器的数据库中,情况并非如此。
但是对于日常查询写作,尤其是在最外层select
,select *
还是select t.*
非常方便的。
对于EXISTS
和NOT EXISTS
,它根本没有区别。我通常写:
EXISTS (SELECT 1 FROM `table` WHERE ~~STATEMENT~~)
EXISTS
并且NOT EXISTS
只寻找行的存在,而不是列中的值。因此,选择的内容应该对性能没有影响。我使用SELECT 1
它是因为它很容易打字,而且我认为它很清楚地传达了它需要什么。
推荐阅读
- android - 为什么 Google 应用内更新在实际可用时看不到任何更新?
- android - 如何处理 Android 应用程序中的版本更改
- gfortran - gfortran 编译器的变化导致值的变化
- docker - docker 容器似乎没有继续运行
- sql-server - 如何在 OPENQUERY SQL 语句的 where 子句中使用 #Temp Tables 的值?
- laravel - 如何修复“调用未定义的方法 Illuminate/Database/Eloquent/Relations/BelongsTo::attach()”
- python - 如何使用 re.sub 功能进行以下操作?
- ruby-on-rails - 使用 RSpec 迭代某些模型属性
- pdf - PDF - 在超链接中使用的 Nameddest
- flutter - dart排序方法的使用方法(附示例代码)