选择所有列对性能不利吗?
Posted
技术标签:
【中文标题】选择所有列对性能不利吗?【英文标题】:Is it bad for performance to select all columns? 【发布时间】:2014-09-25 10:07:42 【问题描述】:SELECT
一次使用所有列是否不好,即使您可能不需要所有列?但是,您可能在其他任务中需要它们,但您懒得为每个任务编写查询。
您是否应该只在 SELECT
只需要您需要的列的地方进行查询,如果您需要另一列则再次执行此查询?
所以基本上问题是:它对SELECT
一列与多列的性能有什么影响?
查询非常简单(没有函数、连接等) 例如:
SELECT
id, name, status, date
FROM user_table
WHERE user_id = :user_id
【问题讨论】:
它确实会影响性能,但实际效果值因很多因素而异。通常 - 您希望您的 DBMS 服务器不做超过满足您的要求所需的工作。另一方面 - 查询越短,mysql解析它的速度就越快。 看起来像这样 - ***.com/questions/3180375/select-vs-select-column 【参考方案1】:这里的问题不在于数据库服务器,而在于网络通信。通过一次选择所有列,您是在告诉服务器返回给您,一次所有列。至于对 IO 的担忧以及所有这些,这些在问答@Karamba 中得到了很好的解决发表评论:select * vs select column。但是对于大多数现实世界的应用程序(我在任何意义上都使用“应用程序”),主要关注的是网络流量以及序列化、传输和反序列化数据需要多长时间。虽然真的,答案都是一样的。
因此,如果您打算全部使用所有列,那么撤回所有列非常好,但这可能需要大量额外的数据传输,尤其是当您在列中存储冗长的字符串时。当然,在许多情况下,差异是无法察觉的,而且主要只是原则问题。不是全部,而是绝大多数。
这实际上只是您前面提到的懒惰(相信我,我们现在都有这种感觉)与性能的重要性之间的权衡真正。
总而言之,如果您确实打算使用所有列值,最好一次将它们全部拉回,然后提交一堆查询。
将其想象为进行网络搜索:您进行搜索,找到您的页面,您只需要一个细节。您可以阅读整个页面并了解有关该主题的所有内容,或者您可以直接跳到有关您正在寻找和完成的部分。如果这就是你想要的,后者会快得多,但如果你必须了解其他方面,你最好第一次阅读它们而不是再次搜索并找到谈论它的网站。
如果您不确定将来是否需要其他列的值,那么作为开发人员,您需要为哪种情况更有可能做出决定。
这完全取决于您的应用程序是什么、您的数据是什么、您如何使用它以及性能对您的重要性真正。
【讨论】:
【参考方案2】:选择单个列可以对某些查询的性能产生很大影响。例如,查询引擎处理索引比在原始数据页中查找数据更有效。如果覆盖索引可用——即包含查询所需的所有列的索引——那么查询将运行得更快。对于对于可用内存来说太大的大型表,使用覆盖索引可能是一个巨大的胜利。 (想想在某些情况下性能会提高几个数量级。)
有限数量的列是有益的另一种情况是当一个或多个列非常大时,例如 BLOB 或 TEXT 列。它们的大小可以增长到数万字节甚至兆字节。检索它们并给服务器带来很大的负载。
使用*
存在危险,如果您已经准备好语句并且表的底层结构发生了变化。查询本身可能会过时(我在其他数据库上遇到过这个问题,但不是专门在 MySQL 上)。潜在的更改可能就像更改列的名称一样简单。被捕获为编译时错误的是运行时错误,它可能更加神秘。
一般来说,避免*
的原因更多地与网络性能有关。在许多情况下,它不会有太大的不同。如果您从表中返回 20 行,其中每行包含平均 100 或 200 个字节,那么在大多数硬件环境中选择所有列和列的子集之间的差异将很小。查询所花费的大部分时间将用于编译查询、在引擎中执行查询以及读取数据页。返回 200 字节或 2000 字节之间的差异可能不会有太大差异。
但是,在某些情况下(例如上面列出的情况),它可以产生很大的不同。因此,避免使用*
是一个好习惯,但偶尔使用它可能不会让您的系统崩溃。
【讨论】:
以上是关于选择所有列对性能不利吗?的主要内容,如果未能解决你的问题,请参考以下文章
可以使用 hbase-spark 连接器按性能良好的列对 hbase 行进行排序吗?