即使您可能没有全部列,但SELECT
所有列都不是很糟糕吗?但是,你可能在另一个任务中需要它们,但是你懒得为每个任务编写查询。
如果您只需要SELECT
只需要您需要的列的查询,并且如果您需要其他列,请再次执行此查询吗?
所以基本上问题是:它对SELECT
一列与多列的性能有任何影响吗?
查询非常简单(没有函数,连接等) 例如:
SELECT
id, name, status, date
FROM user_table
WHERE user_id = :user_id
答案 0 :(得分:13)
这里的问题不仅仅是数据库服务器,而只是网络通信。通过一次选择所有列,您告诉服务器返回给您,所有列一次。至于对IO的关注以及所有这些,在问答中很好地解决了这些问题@Karamba发表了评论:select * vs select column。但对于大多数实际应用程序(我在各种意义上都使用“应用程序”),主要关注的是网络流量以及序列化,传输然后反序列化数据所需的时间。虽然真的,答案是相同的。
因此,如果您打算全部使用它们,那么撤回所有列非常棒,但这可能需要大量额外的数据传输,特别是如果您在列中存储冗长的字符串。当然,在许多情况下,差异将无法察觉,而且大多只是原则问题。不是全部,而是绝大多数。
这真的只是你前面提到的懒惰(并且相信我,我们都有这种感觉)和现在真正的重要性之间的权衡。
所有人都说过,如果你做打算使用所有的列值,你最好立即将它们全部拉回来然后你提交一堆查询。
将其想象为进行网络搜索:您进行搜索,找到您的网页,而您只需要一个细节。您可以阅读整个页面并了解有关该主题的所有内容,或者您可以跳到有关您正在寻找和完成的内容的部分。如果这就是你想要的,那么后者要快得多,但是如果你将要了解其他方面,那么你第一次阅读它们会比再次进行搜索更好该网站谈论它。
如果您不确定将来是否需要其他列值,那么您打算作为开发人员进行调用,更有可能发生这种情况。
这完全取决于您的应用程序是什么,您的数据是什么,您如何使用它,以及真正对您的重要性。
答案 1 :(得分:8)
选择单个列可以对某些查询的性能产生很大影响。例如,查询引擎处理索引而不是在原始数据页中查找数据更有效。如果覆盖索引可用 - 即包含查询所需的所有列的索引 - 则查询将运行得更快。对于对于可用内存而言太大的大型表,使用覆盖索引可能是一个巨大而巨大的胜利。 (在某些情况下,可以考虑改进性能的数量级。)
有限数量的列有益的另一种情况是当一个或多个列非常大时,例如BLOB或TEXT列。它们的大小可以增长到数万字节甚至兆字节。检索它们并在服务器上施加很大的负担。
如果您准备好了语句并且表的基础结构发生了变化,那么使用*
会有危险。查询本身可能已经过时(我在其他数据库上遇到过这个问题,但在MySQL上并没有特别说明)。潜在的变化可能就像更改列的名称一样简单。作为编译时错误而被捕获的是运行时错误,可能更加神秘。
一般而言,避免*
的原因更多地与网络性能有关。在许多情况下,它不会产生太大的影响。如果从每行包含的表中返回20行,平均为100或200字节,则在大多数硬件环境中,选择所有列和列的子集之间的差异将很小。查询花费的绝大部分时间用于编译查询,在引擎中执行查询以及读取数据页面。返回200字节或2000字节之间的差异可能不会有很大差异。
但是,有些情况(例如上面列出的情况)会产生很大的不同。因此,避免*
是一个好习惯,但是现在使用它可能不会打倒你的系统。