sql 性能讨论

6 天前
 sheaned
在 sql 查询中都说不推荐使用 select *,而是指定字段,性能会更好。尤其是返回大量数据的情况下。
那么如果只返回一条数据的情况下,select * 和指定字段性能上会有多大的区别呢?
2456 次点击
所在节点    MySQL
25 条回复
whrss9527
6 天前
如果 select 索引字段,条件也在索引上,大表会走索引查询,无需回表就可以查到数据,这时候性能上会快很多。
dylanqqt
6 天前
如果 select 字段没有命中索引,你 select 字段和你 select * 差不了多少。
glacer
6 天前
@dylanqqt 网络传输有区别
coderzhangsan
6 天前
以 mysql innodb 引擎为例,主键和唯一键查询,只返回一条数据,因为聚簇索引结构,所以 * 和 指定字段没啥区别。
iyiluo
6 天前
没发比,如果字段里面有 text 类型,网络传输都要一段时间,如果都是 int 类型的字段,一两条根本没什么区别。总之养成好习惯,只返回需要的
ksedz
6 天前
性能差别不大,但是后续维护上 DDL 语句添加字段有可能让你之前的 select * 代码挂掉。
spritecn
6 天前
@dylanqqt 对只要不是索引直出,都差不多,但有大字段或一直查千以上条的话就得考虑出口的 IO
spritecn
6 天前
话说,被这个 select * 优化坑的年轻人不是一个两个啊
Configuration
6 天前
0.0001 秒
0.00001 秒

有多大差距?可以说没多大差距,也可以说有 10 倍差距
OliverDD
6 天前
这句话有个前提,是列式数据库还是行式数据库。如果是行式数据库,没啥区别,对于硬盘层都是读取整行的数据后,在内存中过滤掉你不要的列;而如果是列式数据库,那就涉及到 IO 次数了,只选择你需要的行远比 select *快得多的多。
dylanqqt
6 天前
@glacer 除非非常非常多的数据,不然的话区别可以忽略不计,并且 op 说了只返回一条数据,这基本没影响。
LPJD
6 天前
看列的数量,返回结果内容的数量,被请求次数。管理系统,大部分情况优不优化 select*丝毫不影响用户体验
foufoufm
6 天前
感觉除了 slelect * 性能的问题,还有一点好处是可读性吧?
linora
6 天前
对 oracle 深入了解一些的应该都有听过 sga 和 pga

sga:全局缓存区
pga:会话对应 server 端进程对应缓存区

select 操作中有一步叫做字段投影,即将 sga 中数据块中相关行的相关的列放到 pga 中去

所以仅 select 一部分列的操作相对 select *,pga 中占用内存会少一些
lvlongxiang199
6 天前
为啥不自己构造数据试下呢
yinmin
6 天前
select * 还有一个潜在的问题,如果存在多表 join ,随着项目多期开发,表字段会发生变更,如果某个表添加了另外一个表的同名字段,而 2 个表正好有 join ,这时 select *会出现歧异性。而且此类错误很容易在测试阶段没被发现,上线后造成事故。

所以,很多公司有规定,select 不允许用*,字段必须加上表别名。
jun771480011
6 天前
不谈流量的话:一条数据没有区别;
guanhui07
6 天前
大字段就有 io ,通常区别不大,个人还是喜欢取该取的字段足够就好了 而不是 *
coder01
6 天前
@yinmin 这个坑我遇到过
NoKey
6 天前
50 个字段,只查 1 个字段,也要*么?问题要结合实际场景来看。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1109614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX