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