Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么不鼓励在select语句中使用通配符*?_Mysql_Sql_Select - Fatal编程技术网

Mysql 为什么不鼓励在select语句中使用通配符*?

Mysql 为什么不鼓励在select语句中使用通配符*?,mysql,sql,select,Mysql,Sql,Select,在此自我页面中,我被建议不要在SQL查询中使用通配符* 错误查询 SELECT * FROM table 而不是 SELECT field_a, field_b, field_c FROM table 我只理解一个原因,如果您只需要从该查询中了解3个字段,那么如果您只想使用其中的几个字段,那么强制sql引擎处理所有字段并将它们发送回您的程序是没有意义的 但这让我怀疑,如果您需要检索的所有(或几乎所有)字段数据,使用它是否正确,甚至在这种情况下,最好指定所有字段 除了减少从DB引擎发送到程序的

在此自我页面中,我被建议不要在SQL查询中使用通配符
*

错误查询

SELECT * FROM table
而不是

SELECT field_a, field_b, field_c FROM table
我只理解一个原因,如果您只需要从该查询中了解3个字段,那么如果您只想使用其中的几个字段,那么强制sql引擎处理所有字段并将它们发送回您的程序是没有意义的

但这让我怀疑,如果您需要检索的所有(或几乎所有)字段数据,使用它是否正确,甚至在这种情况下,最好指定所有字段


除了减少从DB引擎发送到程序的数据量之外,还有其他原因可以避免使用通配符吗?

您所理解的原因非常有效,可能是最有力的原因

在许多应用程序中,表包含太多的列(比如20列),并且表大小也很大,包含数百万条记录,如果您只想检索特定的列,那么使用通配符*就没有意义,因为MYSQL引擎必须不必要地迭代所有列和所有行

但是要说明一点,这与不鼓励使用
*
完全不同
事实上,在相同的情况下,当您有20列并且希望从所有列中检索值时,这可能是一个福音

若要添加更多内容,*可能会因为地板原因而变慢:

  • 在表中,您不会对所有列创建索引,查询使用完整表扫描。因此,它使查询速度变慢

  • 当您希望从包含可变长度列的表返回尾部字段时,可能会导致轻微的搜索开销


使用
*
表示您正在查询表的所有字段。如果这就是应用程序应该做的,那么使用它是有意义的


如果你的应用程序不应该这样做,那么这可能会带来麻烦。如果表在将来被修改,最好的情况是应用程序将查询不需要的列,这可能会影响性能。最坏的情况是,它会突然中断。

除了以下两种被认为是编写查询的有效和优化方法之外,没有这样的具体原因

  • 您可能不需要查询中的所有字段,所以最好只获取所需字段,这样可以减少运行查询的系统负载,并且可以更快地获取数据
  • 有时,我们有一些字段的名称很奇怪,比如lcf_user_email_response,在获取数据并在站点上显示数据时,我们不想使用这些字段,因此为了使字段别名成为字段名,我们使用的是字段名,而不是通配符
  • 使用字段名可以让我们更自由地处理字段和输出


    但是通配符没有这样的限制或不好,如果需要所有字段,就使用它们。

    我同意所有其他人的观点,它本身不是“邪恶的”,但我确实尝试避免它,因为我遵循的是特定的设计模式。通常在设计表之后,我会创建视图并将相关表连接在一起。最后,我创建存储过程,然后从视图中进行选择

    我发现在视图和存储过程中使用通配符选择是有问题的(至少在SQL Server中是这样)。起初一切看起来都很好,但在将新字段添加到源表后,它就崩溃了。它会破坏视图,然后必须重建视图才能修复。根据系统的大小,这可能是一个问题


    由于更改源表后,视图中的通配符选择会导致视图损坏,因此我已开始避免通配符选择,并将在向表中添加新列后手动更改视图。

    您在何处找到此建议?嗯,最近,让我在Gordon的答案评论中搜索一下,您是否注意到您正在用
    select*
    编写答案?如果
    select*
    显然是邪恶的,你真的认为他会写吗?在大多数情况下,你不使用
    select*
    ,因为它不清楚,但不是“邪恶的”。不知道为什么草莓说不要使用select*。如果你想要所有的字段就可以了。如果你不这样做,那么显然你只需要选择你需要的。请注意,问题是关于何时需要所有列。@DenysSéguret:-我试着用一个例子来解释它。希望这能清楚地说明问题,还是希望我添加更多解释?如果表中有200列,则可能是做错了什么。不为所有列编制索引这一事实如何导致缓慢的
    选择*
    ?(回答:不能)如果
    select*
    由于表格扫描太慢,列出列对您没有帮助。请注意,问题是关于何时需要所有列。@DenysSéguret我不确定我是否理解了我的区别。假设表有三列,应用程序需要所有这些列。这意味着它需要A、B和C列,还是所有列?现在没有区别,但是如果将来添加第四列,应用程序是否要查询它?如果答案是肯定的,那么无论如何都应该使用
    *
    。如果为否,则不应使用
    *