分享 / 0 / 15 / 创建于 4年前 / 更新于 4年前
关系数据库是行存储,即使不用那一列,也会从存储读取到内存.所以select * 并不会比select xxx慢。
不是吧?怎么和我学的不一样
=。=我个人看法是多数情况是不需要获取所有列的数据的,没有用到的数据就不取出来,而且select *是不会出现索引覆盖的
select *
blog.csdn.net/xx123698/article/det...
个人看法,mysql对于还是xxx的执行速度是一样的,之所以不用, 是为了减少无关数据的网络传送
等你的表字段多的时候你就会知道哪个快慢了
对开发来说都是select * 的。因为有时候,你select a,b 你开发的时候没有问题,当你的逻辑又要用到c时,你可能就不记的select 加上c ,,排查了好久。不知道为什么。。
还有就是关联的时候,如果关联字段没有加上,你也会关联不出来的。
当然你select * 你返回API时不一定返回所有字段。你可以使用api资源返回前端想要的字段。
反正我跟我同事说,你开发偷懒就select * ,如果你是一个代码洁癖。你就自已写。我觉的中小企业数据量可以完全不计
一个是有无效网络传输
一个是有些情况不能索引覆盖(都select * 了 估计也没考虑过覆盖吧)
感觉最重要的是innodb的buffer的刷新覆盖,造成buffer中大量的无效数据(有大字段的话会比较明显)
之前找工作时,面试官问我一个问题:select 某些字段 为什么比 select * 快。我的回答:查询的字段少自然比查询所有字段快。最后,面试官给的回答是:其实这两个查询速度基本一样,之所以快是因为数据量小网络传输快 :joy: 不知道大家认不认同?
这个要看你的查询条件使用到的索引类型。如果以主键为条件,那是一样的,因为查主键用到的是聚簇索引,聚簇索引的结构是B+树,其叶子节点保存了每天记录的完整字段。
如果条件是二级索引,比如,有c1,c2组成的联合索引,这时select c1,c2 from table where c1=xx就比 select * …. 要快,因为前面的不用回表(二级索引的B+树叶子节点只保存了主键+索引列,查询的字段的如果不包含在叶子节点的数据里面,就需要通过查到的主键回表再查一次)。当然,有个大前提是使用INNODB引擎。
mysql 会把 select * from table 转换成 select xx1, xx2,xx3 from table
假如 xx2 是 text 类型,用来存放文章内容的,在全部取出,你可以考虑下网络带宽的问题
我还是那句话,select xxx,在增减字段时还要去改代码,关键你不知道哪些地方要改!!!
另外:select * 字段多?大字段?那你表设计就有问题。
我觉得从数据库的角度来说的话,最敏感的就是I/O操作 *可能会带来I/O操作的增加,所以个人认为尽量不用为好
字段少几乎无差别的~~索引、忌用语句才是关键呵呵
回表了解一下?
我要举报该,理由是:
不是吧?怎么和我学的不一样
=。=我个人看法是多数情况是不需要获取所有列的数据的,没有用到的数据就不取出来,而且
select *
是不会出现索引覆盖的blog.csdn.net/xx123698/article/det...
个人看法,mysql对于还是xxx的执行速度是一样的,之所以不用, 是为了减少无关数据的网络传送
等你的表字段多的时候你就会知道哪个快慢了
对开发来说都是select * 的。因为有时候,你select a,b 你开发的时候没有问题,当你的逻辑又要用到c时,你可能就不记的select 加上c ,,排查了好久。不知道为什么。。
还有就是关联的时候,如果关联字段没有加上,你也会关联不出来的。
当然你select * 你返回API时不一定返回所有字段。你可以使用api资源返回前端想要的字段。
反正我跟我同事说,你开发偷懒就select * ,如果你是一个代码洁癖。你就自已写。我觉的中小企业数据量可以完全不计
一个是有无效网络传输
一个是有些情况不能索引覆盖(都select * 了 估计也没考虑过覆盖吧)
感觉最重要的是innodb的buffer的刷新覆盖,造成buffer中大量的无效数据(有大字段的话会比较明显)
之前找工作时,面试官问我一个问题:select 某些字段 为什么比 select * 快。我的回答:查询的字段少自然比查询所有字段快。最后,面试官给的回答是:其实这两个查询速度基本一样,之所以快是因为数据量小网络传输快 :joy: 不知道大家认不认同?
这个要看你的查询条件使用到的索引类型。如果以主键为条件,那是一样的,因为查主键用到的是聚簇索引,聚簇索引的结构是B+树,其叶子节点保存了每天记录的完整字段。
如果条件是二级索引,比如,有c1,c2组成的联合索引,这时select c1,c2 from table where c1=xx就比 select * …. 要快,因为前面的不用回表(二级索引的B+树叶子节点只保存了主键+索引列,查询的字段的如果不包含在叶子节点的数据里面,就需要通过查到的主键回表再查一次)。
当然,有个大前提是使用INNODB引擎。
mysql 会把 select * from table 转换成 select xx1, xx2,xx3 from table
假如 xx2 是 text 类型,用来存放文章内容的,
在全部取出,你可以考虑下网络带宽的问题
我还是那句话,select xxx,在增减字段时还要去改代码,关键你不知道哪些地方要改!!!
另外:select * 字段多?大字段?那你表设计就有问题。
我觉得从数据库的角度来说的话,最敏感的就是I/O操作 *可能会带来I/O操作的增加,所以个人认为尽量不用为好
字段少几乎无差别的~~索引、忌用语句才是关键呵呵
回表了解一下?