• 为啥不建议使用Select *


    看看阿里巴巴手册说的三点

    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';
    
    • 1

    也就是直接通过查询索引,拿出来的数据就已经满足了查询返回的字段数据。 无需额外其他查询操作了,也就是索引覆盖了。 这样肯定快。

    如果初衷是查 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*就会很慢,怎么解决?给其他字段建索引?那么维护的成本非常的高!索引也是需要存起来的,也是需要占用磁盘空间的。

  • 相关阅读:
    半正定矩阵的对角元素不小于该矩阵的最小特征值
    i711800h和i511320h哪个好
    基于JSP+SSM的网上商城购物网站设计
    Spring(三)- Spring中Bean的配置
    SSM之spring注解式缓存redis
    华为机考入门python3--(35)牛客35-蛇形矩阵
    【无标题】
    不用445端口,替代Windows共享,局域网文件共享新方式
    EL表达式
    Angular React Vue 比较 - 前言
  • 原文地址:https://blog.csdn.net/qq_52563729/article/details/125952531