• 索引整理


    索引科普

    1.索引是存储在磁盘中的,不是存储在内存中的,索引一定会持久化磁盘

    2.我们的电脑持久化存储采用磁盘,磁盘有磁道,磁道有磁头,磁头的移动是进行读取的过程,磁头移动快慢就是读取的快慢

    3.由1968年P.Denning研究发现,对程序执行有以下特性

    • 局部性原理

    程序和数据访问都有聚集成群的倾向,在一个时间段内仅使用其中一小部分(空间局部性)

    最近访问的程序代码和数据,再次访问可能性很大(时间局部性)

    • 磁盘预读(为页(page)的整数倍)

    页是存储器的逻辑块,操作系统往往将主存和磁盘存储分割为连续的块,这个块通常为固定大小

    1968年P.Denning研究了程序执行的局部性(principle of locality),对于程序局部性原理进行研究还有Knuth(分析的一组Fortran程序)、Tanenbaum(分析操作系统的过程)、Huck(分析通用科学计算的程序)。
    

    4.什么是索引?

    预先知识

    mysql整体架构

    • 索引是帮助MySQL的进行优化的,在架构图的优化器中

    • 存储引擎:不同的存放位置,不同的文件格式

    InnoDB: 磁盘 MyISAM:磁盘 memory:内存

    MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。
    
    InnoDB:支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。
    
    聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 InnoDB
    非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行 MyISAM
    

    聚簇索引

    • .frm 存放表结构
    • .ibd 存放数据文件和索引文件(在innodb下通常看不到这个文件,被整合到了ibdata1)
    • .opt 是存数据库信息

    我们使用innodb存储,所有都通过表空间进行存储,创建表必然生成.frm和.ibd文件,

    设置不整合到ibdata1,使用分文件存储
    set global innodb_file_per_table=on;
    

    非聚簇索引

    索引和数据单独一个文件:MyISAM

    • .frm:存放表结构

    • .MYI 存放索引数据

    • .MYD 存放实际数据

    什么是索引:
    • 索引是帮助MySQL高效获取数据的数据结构

    • 索引存储在文件系统中

    • 索引的文件存储形式和存储引擎有关

    • 索引的文件结构

      • hash

      哈希表可以完成索引存储,每次在添加索引要计算指定的hash值,取模运算计算下标

      适合场景:

      ​ 等值查询

      ​ 无序查询

      hash表在使用过程中,需要将数据全部加载到内存中,比较耗费内存,不是很合适

      多叉树->二叉树->avl树->红黑树->B-树->B+树

      红黑树是基于avl树的,损失部分查询性能,提升插入性能,在红黑树中最低子树和最高子树之差小于2倍即可,在插入过程中,不需要进行N次旋转,而且加入变色特性,来满足插入和查询性能的平衡

      B树:

      1.所有键值分布在整棵树中

      2.搜索可能在非叶子结点结束,在关键字全集内做一次查找性能逼近二分查找

      3.每个节点最多有m个子树

      4.根节点至少2个子树

      5.分支节点至少m/2个子树

      6.所有叶子节点都在同一层,每个节点最多有m-1个key,都以升序排列

    ​ B+树:

    ​ 解决B树深度过深问题。

    ​ 注意:

    ​ 1.InnoDB B+Tree 叶子节点直接放置数据,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id作为主键

    ​ 2.如果创建的索引键是其他字段,那么叶子节点中存储的是主键,再通过主键进行找到相应记录,叫做回表

    5.索引的分类

    mysql索引的5种类型:主键索引、唯一索引、普通索引、全文索引、组合索引

    • 主键索引

    主键是一种唯一索引,但它必须指定为PRIMARY KEY,每个表只有一个主键

    • 唯一索引

    索引列值只出现一次,必须唯一,值可以空(回表,不覆盖)

    • 普通索引(建议这个,不用2次)

    基本索引,值可以空,没有唯一性限制(回表,会覆盖索引)

    • 全文索引,MyISAM支持,Innodb在5.6之后支持(一般不会用到,公司在做搜索引擎,一般使用es、solr、Lucene)目前Lucene不用了,solr在老牌公司用,更多选择es

    全文索引类型是FULLTEXT,全文索引可以在varchar、char、text类型的列上创建

    • 组合索引

    多列组合成一个索引

    最左匹配,先去匹配左边的

    一个查name,age,另一个查age

    可以优化为age,name的索引

    是否回表 是否覆盖
    主键索引 没有回表 不覆盖
    唯一索引 没有回表 不覆盖
    普通索引 回表 覆盖

    执行计划:explain select * from xxx where xxx=xxx

    6.MyISAM和InnoDB区别

    MyISAM不支持事务,行锁,外键,适合大量select操作

  • 相关阅读:
    Object有哪些公用方法?(转)
    equals和==的区别(转)
    switch语句中case的标签
    (常见面试问题)九种基本数据类型的大小,以及他们的封装类
    English
    plot
    文件读写
    标准化
    独热编码
    一阶逻辑
  • 原文地址:https://www.cnblogs.com/littlepage/p/11877718.html
Copyright © 2020-2023  润新知