美文网首页
索引相关

索引相关

作者: 孙毛毛丶 | 来源:发表于2021-03-18 20:12 被阅读0次

    1.MySQL中使用较多的索引有Hash索引,B+树索引
    2.InnoDB默认索引实现为:B+树

    hash索引

    1.底层为 hash 表,调用 hash 函数获得键值对,然后回表查询获得实际数据,
    2.B+树底层是多路平衡查找树,每一次查询都是从根节点出发,叶子节点上有值,然后回表查询数据

    不同:

    1.hash索引进行等值查询更快(大多情况下),但是无法范围查询
    2.B+树的所有节点皆遵循左节点小于父节点,右节点大于父节点.天睿支持范围
    3.因此,hash 不支持使用索引进行排序
    4.hash 不支持模糊查询以及最左前缀匹配.因为 AAA和 AAAC没有相关性
    5.hash 索引必须回表查询数据,而 B+树再(聚簇索引,和覆盖索引)不用回表就完成查询
    6.hash索引虽然快,单不稳定,性能无法预测,当某个键值对大佬重复.会发生 hash碰撞.

    什么是聚簇索引

    B+树的索引中,叶子节点可能存储了当前的 key 值.也可能存储当前 key 值以及整行的数据.这就是聚簇索引.在 innodb 中.只有主键索引是聚簇索引,如果没有主见,则挑选一个唯一键建立聚簇索引.如果没有唯一键,会隐式生成一个健来建立聚簇索引.聚簇索引可以获取整行数据,不需要回表

    非聚簇索引一定会回表查询吗?

    不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询.
    例如 age 建立索引
    select age from employee where age < 20 查询时.已经包含 age 信息,不会再次回表查询

    索引建立准则

    1.使用频率,联合索引的顺序,过多索引造成表太大

    索引没用的的几种情况
    1. 不等于查询
      2.数学运算或者函数
      3.like '%abc'
      4.mysql 发现全表扫描比索引快
      5.联合索引.前面一个为范围查询,后面即使符合最左前缀也无法用到
    ACID
    A=Atomicity 原子性,就是上面说的,要么全部成功,要么全部失败
    C=Consistency 从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态.
    I=Isolation 隔离性: 通常来说:一个事务在完全提交之前,对其他事务是不可见的.注意前面的通常来说加了红色,意味着有例外情况.
    D=Durability 持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果.
    
    字段为什么要求定义为not null?

    null值会占用更多的字节,且会在程序中造成很多与预期不符的情况.

    varchar(10)和int(10)代表什么含义?

    archar的10代表了申请的空间长度,也是可以存储的数据的最大长度,而int的10只是代表了展示的长度,不足10位以0填充

    MySQL的binlog有有几种录入格式?分别有什么区别?

    statement:记录单元为语句
    row:记录单元为每一行的改动
    mixed:普通操作使用statement记录,当无法使用statement的时候使用row.

    新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录.

    UNION、UNION ALL

    UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据
    UNION ALL 操作符重复数据全部显示,不去重

    char和varchar 的区别

    1.char(10), 值为:abc,存储为:abc (abc+7个空格)
    2.类型varchar(10), 值为:abc,存储为:abc (自动变为3个的长度)
    3.超过长度都自动截取
    4.char最多可以存放255个字符
    5.varchar的最大长度为65535个字节
    6.varchar 字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766个字符,字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845个字符

    对于InnoDB表
    1.因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利;
    2.存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。
    3.十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

    聚族索引与非聚族索引的区别

    1.聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据,每张表只能拥有一个聚簇索引。

    特点:聚簇索引默认是主键
    InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。

    2.非聚簇索引(也叫二级索引):将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行

    特点:非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值
    若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。(重点在于通过其他键需要建立辅助索引)

    image.png

    按物理存储分类:聚簇索引(clustered index)、非聚簇索引(non-clustered index)

    引用:https://www.jianshu.com/p/fa8192853184

    相关文章

      网友评论

          本文标题:索引相关

          本文链接:https://www.haomeiwen.com/subject/ttbmtltx.html