看看阿里巴巴手册说的三点
1)增加查询分析器解析成本。
如果是select * from user , 看到 * ,就会去看看是哪个表 user,然后把所有列值给列出来。
2)增减字段容易与resultMap配置不一致。
这个不太懂
3)无用字段增加网络消耗,尤其是text类型的字段。
这个可以说,就是再引擎层发生的事情,这种查询操作就是刷盘操作,从磁盘刷入内存,涉及到的 磁盘IO开销。
如果是小表,小字段,那么几乎没有影响,那么我们怕的是什么?
tinytext、text、mediumtext、longtext tinybob、blob、mediumblob、longblob
这些大字段,这些字段在mysql上会被当作一个独立的对象处理
4)无法使用索引覆盖
前置技能:什么是索引覆盖
给name字段 建索引, 查询的时候,只用到了 索引的字段,这就是索引覆盖 。
SELECT name FROMUSER WHERE name='1111';
也就是直接通过查询索引,拿出来的数据就已经满足了查询返回的字段数据。 无需额外其他查询操作了,也就是索引覆盖了。 这样肯定快。
如果初衷是查 name, 结果写成了 select * , 变成查多了其他字段, 那其他字段不是索引,肯定无法触发索引覆盖使用场景了,也就是需要额外的回表查询操作了,那这样就慢了。
那么是什么是回表操作
什么是MySQL的回表?
MySQL中的索引有很多中不同的分类方式,可以按照数据结构分,可以按照逻辑角度分,也可以按照物理存储分,其中,按照物理存储方式,可以分为聚簇索引和非聚簇索引。
我们日常所说的主键索引,其实就是聚簇索引(Clustered Index) ;主键索引之外,其他的都称之为非主键索引,非主键索引也被称为二级索引 (Secondary Index),或者叫作辅助索引。
对于主键索引和非主键索引,使用的数据结构都是B+Tree,唯一的区别在于叶子结点中存储的内容不同:
●主键索引的叶子结点存储的是一行完整的数据。
●非主键索引的叶子结点存储的则是主键值。这就是两者最大的区别。
所以,当我们需要查询的时候:
这个地方我们假设id是主键
1.如果是通过主键索引来查询数据,例如select * from user where id=100,那么此时只需要搜索主键索引
的B+Tree 就可以找到数据。
2.如果是通过非主键索引来查询数据,例如select * from user where username=’ javaboy ',那么此时需
要先搜索username这一列索引的B+Tree,搜索完成后得到主键的值,然后再去搜索主键索引的B+Tree,就可以获取到一行完整的数据。
对于第二种查询方式而言,一共搜索了两棵B+Tree,第一次搜索B+Tree拿到主键值后再去搜索主键索引的B+Tree,这个过程就是所谓的回衣。入
从上面的分析中我们也能看出,通过非主键索引查询要扫描两棵B+Tree,而通过主键索引查询只需要扫描一棵B+Tree,所以如果条件允许,还是建议在查询中优先选择通过主键索引进行搜索。
因为有回表操作select*就会很慢,怎么解决?给其他字段建索引?那么维护的成本非常的高!索引也是需要存起来的,也是需要占用磁盘空间的。