查询字段的数量对查询效率的影响
数据库设计开发规范中经常会提到检索数据尽量只返回需要的数据字段,避免使用"SELECT *",直观感觉,客户端-服务端,返回的数据越多,网络传输的成本可能就越高。
技术社群的这篇文章《技术分享 | MySQL:查询字段数量多少对查询效率的影响》从代码层面,对这个问题作了说明,可以从另外一个角度了解为什么推荐尽量只返回需要的数据字段,而不是"SELECT *"。
本文给出一些函数接口,末尾给出一些调用堆栈,为感兴趣的朋友做一个参考。一、问题由来我们知道执行计划的不同肯定会带来效率的不同,但是在本例中执行计划完全一致,都是全表扫描,不同的只有字段个数而已。其次,测试中都使用了where 条件进行过滤(Using where),过滤后没有数据返回,我们常说的 where 过滤实际上是在 MySQL 层,当然某些情况下使用 ICP 会提前在 Innodb 层过滤数据,这里我们先不考虑 ICP,我会在后面的文章中详细描述 ICP 的流程,本文也会给出 where 过滤的接口,供大家参考。下面的截图来自两个朋友,感谢他们的测试和问题提出。另外对于大数据量访问来讲可能涉及到物理 IO,首次访问和随后的访问因为 Innodb buffer 的关系,效率不同是正常,需要多测试几次。
测试1:



测试2:

我们通过这两个测试,可以发现随着字段的不断减少,效率越来越高,并且主要的区别都在 sending data 下面,这个状态我曾经大概描述过参考文章:
https://www.jianshu.com/p/46ad0aaf7ed7
https://www.jianshu.com/p/4cdec711adef