我听到很多不要使用 *(星号),而是命名我需要的字段。是因为性能问题还是安全原因?有人可以为此说出一些好的论据吗?
所以不是
SELECT * FROM users WHERE name='John';
但反而
SELECT name FROM users WHERE name='John';
我听到很多不要使用 *(星号),而是命名我需要的字段。是因为性能问题还是安全原因?有人可以为此说出一些好的论据吗?
所以不是
SELECT * FROM users WHERE name='John';
但反而
SELECT name FROM users WHERE name='John';
在生产查询中不使用星号的最大原因是将非 SQL 代码与数据库模式的更改隔离开来,或者使此类更改更难被忽视。
例如,如果您的代码使用星号查询,期望name
在第一列和address
第二列中出现,如果架构更改为在您已经阅读的两列之前添加第三列,则您的代码将获取该新列名称,并用名称代替地址。最糟糕的是,它会在没有崩溃的情况下完成所有这些操作:用户只会看到垃圾数据。
相反,具有显式命名列的查询将获得正确的列,尽管架构发生了变化,或者如果所需的列已被删除或重命名,则会中断。这将立即指出问题的根源,使您可以轻松调查和解决问题。
这是一个性能问题。当您 时SELECT *
,您正在检索表中的每个字段。如果SELECT name
是 ,则仅选择名称字段。当仅选择您需要的字段时,可以从数据库服务器传输到应用程序的数据要少得多。
SELECT*
表示从您的表中选择全部。它将选择所有列。
但是如果您指定仅选择查询中的某些列
SELECT name ---> 这将只选择 name 列
因为如果您选择 *,那么您将获得该查询的所有列,这意味着您的数据集的内存使用率更高,而不仅仅是获得您需要的列。
对我来说,这更像是关于理智、可读性和常识的问题。
当你只需要时name
——为什么不明确地写出来呢?
这将使您的查询为读者提供更多信息。
但是当我看到可怜的开发人员明确地写了几十个字段名只是为了遵循这种“性能”的废话——这让我很受伤。
评论中的一个重要说明:
编写不依赖于查询中字段的顺序或数量的代码确实很重要。
因此,只需使用*
, 获取关联数组,您的代码就不会因为如此愚蠢的原因而中断。
对于我卑微的测试,我有一些不同。0,0002 秒的分数。
好吧,如果这样的差异是您的应用程序的某个瓶颈 - 请使用显式写入字段(尽管解析器需要更多时间来解析您的查询,呵呵 :)
但是,在我的领域中,性能问题从至少 0,001 秒的差异开始. 所以,我不会打扰。