我在许多示例中都看到包含“ SELECT *”语句,即使显然不是所有列,甚至也不是必需/不需要的数据。
好,很方便。也许如果有人创建了通用指南只是想使事情变得简单?
但是,如果我只想从一列中获得一条记录,该怎么办?是否要使用主键有关系吗-SELECT *是好的做法,还是只是懒惰/实际的事情都没关系?
我举一个例子:在“如何使用“ EXISTS”的许多问题/例子中,我看到了这样的解决方案:
(...) AND EXISTS (SELECT * FROM `table` WHERE ~~STATEMENT~~)
当我完全不需要任何数据时,为什么我应该使用*-我所要做的就是检查表中是否存在与STATEMENT相匹配的记录,仅此而已。 那么,为什么到处都看到“ SELECT *”?从字面上看,在所有博客,文章和指南中,我都看到“ SELECT *”,甚至没人提到任何其他解决方案。
我的猜测是,我应该只选择主键以获得最佳性能,例如:
(...) AND EXISTS (SELECT `primary_key_column` FROM `table` WHERE ~~STATEMENT~~)
我错了吗?
答案 0 :(得分:2)
如果您正在编写应用程序代码,那么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
是因为它易于输入,而且我认为可以很清楚地传达出它的要求。