索引整理

索引科普

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操作

posted @ 2019-11-17 19:49  SteveYu  阅读(336)  评论(0编辑  收藏  举报