Mysql 为什么不鼓励在select语句中使用通配符*?
在此自我页面中,我被建议不要在SQL查询中使用通配符Mysql 为什么不鼓励在select语句中使用通配符*?,mysql,sql,select,Mysql,Sql,Select,在此自我页面中,我被建议不要在SQL查询中使用通配符* 错误查询 SELECT * FROM table 而不是 SELECT field_a, field_b, field_c FROM table 我只理解一个原因,如果您只需要从该查询中了解3个字段,那么如果您只想使用其中的几个字段,那么强制sql引擎处理所有字段并将它们发送回您的程序是没有意义的 但这让我怀疑,如果您需要检索的所有(或几乎所有)字段数据,使用它是否正确,甚至在这种情况下,最好指定所有字段 除了减少从DB引擎发送到程序的
*
错误查询
SELECT * FROM table
而不是
SELECT field_a, field_b, field_c FROM table
我只理解一个原因,如果您只需要从该查询中了解3个字段,那么如果您只想使用其中的几个字段,那么强制sql引擎处理所有字段并将它们发送回您的程序是没有意义的
但这让我怀疑,如果您需要检索的所有(或几乎所有)字段数据,使用它是否正确,甚至在这种情况下,最好指定所有字段
除了减少从DB引擎发送到程序的数据量之外,还有其他原因可以避免使用通配符吗?您所理解的原因非常有效,可能是最有力的原因 在许多应用程序中,表包含太多的列(比如20列),并且表大小也很大,包含数百万条记录,如果您只想检索特定的列,那么使用通配符*就没有意义,因为MYSQL引擎必须不必要地迭代所有列和所有行 但是要说明一点,这与不鼓励使用
*
完全不同事实上,在相同的情况下,当您有20列并且希望从所有列中检索值时,这可能是一个福音
若要添加更多内容,*可能会因为地板原因而变慢:
- 在表中,您不会对所有列创建索引,查询使用完整表扫描。因此,它使查询速度变慢
- 当您希望从包含可变长度列的表返回尾部字段时,可能会导致轻微的搜索开销
*
表示您正在查询表的所有字段。如果这就是应用程序应该做的,那么使用它是有意义的
如果你的应用程序不应该这样做,那么这可能会带来麻烦。如果表在将来被修改,最好的情况是应用程序将查询不需要的列,这可能会影响性能。最坏的情况是,它会突然中断。除了以下两种被认为是编写查询的有效和优化方法之外,没有这样的具体原因
但是通配符没有这样的限制或不好,如果需要所有字段,就使用它们。我同意所有其他人的观点,它本身不是“邪恶的”,但我确实尝试避免它,因为我遵循的是特定的设计模式。通常在设计表之后,我会创建视图并将相关表连接在一起。最后,我创建存储过程,然后从视图中进行选择 我发现在视图和存储过程中使用通配符选择是有问题的(至少在SQL Server中是这样)。起初一切看起来都很好,但在将新字段添加到源表后,它就崩溃了。它会破坏视图,然后必须重建视图才能修复。根据系统的大小,这可能是一个问题
由于更改源表后,视图中的通配符选择会导致视图损坏,因此我已开始避免通配符选择,并将在向表中添加新列后手动更改视图。您在何处找到此建议?嗯,最近,让我在Gordon的答案评论中搜索一下,您是否注意到您正在用
select*
编写答案?如果select*
显然是邪恶的,你真的认为他会写吗?在大多数情况下,你不使用select*
,因为它不清楚,但不是“邪恶的”。不知道为什么草莓说不要使用select*。如果你想要所有的字段就可以了。如果你不这样做,那么显然你只需要选择你需要的。请注意,问题是关于何时需要所有列。@DenysSéguret:-我试着用一个例子来解释它。希望这能清楚地说明问题,还是希望我添加更多解释?如果表中有200列,则可能是做错了什么。不为所有列编制索引这一事实如何导致缓慢的选择*
?(回答:不能)如果select*
由于表格扫描太慢,列出列对您没有帮助。请注意,问题是关于何时需要所有列。@DenysSéguret我不确定我是否理解了我的区别。假设表有三列,应用程序需要所有这些列。这意味着它需要A、B和C列,还是所有列?现在没有区别,但是如果将来添加第四列,应用程序是否要查询它?如果答案是肯定的,那么无论如何都应该使用*
。如果为否,则不应使用*
。