当前位置: 首页>数据库>正文

MySQL or导致全表扫描 select *会全表扫描吗

相信很多开发小伙伴在入行以后,都会听到项目经理或开发组长强调:sql脚本中避免使用select *哈 。 曾经我也一样,当经理说起sql中尽量不要使用select * 的时候,内心不以为然,直到有一天被现实打脸真正吃了亏。虽然也知道不让用的几个大概原因,但依然是我行我素。看看手里的项目,心想,毕竟前辈们敲的代码里也不乏有select *的存在,不是到现在也运行的好好的,也没出现什么问题嘛。

自己去问百度为什么不能用的时候,通常是就是那么几点:

1. select * 属于全表扫描,不利于提高查询效率。

2. 如果本身只需要使用表中的几个字段,全量查询增大了使查询结果集,占用更多的数据库内存,增加数据库负担,甚至出现内存溢出。

3. 除了对数据库增加了压力,对应用程序和网络也增加了压力。

百度之后反而更放心了,项目小、数据量小,不怕!后面一段时间我是正手一个select * ,反手一个select *的敲着代码,毕竟省时省力嘛。

直到有一天被现实打了脸。。。。

事情是这样的,某天,系统使用人员突然反馈说:某某页面查询不出数据了。于是我开始了一顿排查,自信的我相信代码一定没问题,必定是数据的问题,于是去检查数据。一番周折后,还是老老实实检查代码吧(有没有类似的经历呢?),代码逻辑也正确,查询sql我近期也没动过。最后发现竟是我的select * 导致了这一场风波。

我的页面查询了A、B两表,大概如下:

SELECT * FROM (SELECT A.* ,B.AGE ,B.NAME,B.CLASS_ID) RS

  而同事在另一个需求开发中也用到了A表,由于剧情需要,同事就在A表中增加了一个CLASS_ID字段,这时我的查询sql就报错了。原因是A、B两表同时有CLASS_ID字段,因此在外层的SELECT查询的时候,会查出两个CLASS_ID,数据库此时会报错“未明确定义列”。说到这里你懂了吗?

当你为使用了select * 而感到高兴的时候,未来增加或删除的一个字段就有可能会让你怀疑人生

所以,看完这篇文章,开始养成良好的代码习惯吧


https://www.xamrdz.com/database/6fg1932745.html

相关文章: