Mysql之索引

 

MySQL数据结构之最左匹配

MySQL InnoDB B+树,叶子节点直接放置整条数据
注意:

  1. InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点中存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6字节的row_id来作为主键
  2. 如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫做回表。简单来说就是数据库会再根据索引创建一个B+Tree,这个树中存的就是索引和对应的主键

回表:就是上述情况,比如主键是id,索引列是name,这样查找name=‘AAA’,就会是先查找name,找到后根据name对应的id,再到另一个索引树中找到id对应的完整的一条数据

聚簇索引:数据和索引放在同一个文件中(比如:InnoDB)
非聚簇索引:数据和索引分开放在两个文件中(比如:MyISAM)

分布式程序不建议主键自增,会引发页分裂和页合并的问题
普通单机程序建议使用主键自增

回表

比如主键是id,并且给name添加了索引,此时数据库会创建两个B+Tree,如果执行select * from table where name = ?,会先在name和id的树中找到id,再用id在另一个树中找到整条数据,这就是回表

索引覆盖

上述情况中,如果查询select id from table where name = ?,直接查询一个树就能得到结果,不用回表就叫索引覆盖

索引下推

select * from table where name = ?and age = ?
这条语句执行的话,会从磁盘先查出符合name = ?的所有数据,加入到mysql server中,再根据age进行筛选

有了索引下推后,会根据name和age来拉取数据,不用在server层做数据的筛选

最左匹配

组合索引,比如name+age,一定是先匹配name再匹配age
举例:

  1. where name = ? and age = ?
  2. where name = ?
  3. where age = ?
  4. where age = ? and name = ?

上述例子中1,2,4会使用索引,4会经过优化成为1
CBO:基于成本的优化
RBO:基于效率的优化

索引下推唯一的缺点是需要在磁盘上多做数据筛选,原来的筛选是放在内存中的,现在放到了磁盘查找数据,并且所有的数据是聚集存放,所以性能不会有影响,而且整体的IO量会大大减少,反而会提升性能

MySQL中的一些名词和概念

MRR:
全称是mult_range read
在内存中做排序

FIC
全称是fast index create
没有FIC时索引的修改过程:

  1. 先创建一个临时表,增删改的操作在临时表中操作
  2. 删除原始索引表
  3. 修改临时表替换原始表

有了FIC后的索引修改过程:
FIC给当前表添加一个share锁,不会有创建临时文件的资源消耗,还是在源文件中,但是此时如果有人发起DML操作,很明显数据完全不一致,所以添加share锁,读取没问题,但是DML会有问题

这部分名词和概念还需要仔细百度一下

索引分类

  1. 主键索引:主键
  2. 唯一索引:值唯一的列
  3. 普通索引:也叫辅助索引、二级索引,除了主键和唯一列以外的创建了索引的列
  4. 全文索引:很少使用,被ES搜索引擎取代
  5. 组合索引:多个字段组合的索引

引匹配方式

  1. 全值匹配:组合索引中的所有的列进行匹配
  2. 匹配最左前缀:只匹配前面的几列
  3. 匹配列前缀:可以匹配某一列的开头部分(like A%可以正常匹配,like %A则会导致索引失效)
  4. 匹配范围值:可以查找某一个范围的数据
  5. 精确匹配某一列并范围匹配另一列:可以查询第一列的全部值和第二列的部分值
  6. 只访问索引列:查询的时候值需要访问索引,不需要访问数据行,本质上i就是索引覆盖

哈希索引

索引优化的小细节

索引监控

MySQL索引详解

 

 

相关系列文章:

 0.Mysql之如何插入数据剖析mysql各个技术点 :通过插入一条数据的过程引出mysql知识点:

1.mysql之事务隔离级别以及MVCC:ACID、事务级别以及产生问题、MVCC(三个隐藏字段、undolog、read_view详解)

2.Mysql之Innodb锁场景:锁分类、RC下各种加锁情况、RR下各种加锁情况

3.Mysql之主从复制原理:主从复制原理、二次提交、MTS、组提交、GTID

4.Mysql之数据结构 :hash、二叉树、AVL、平衡二叉树(红黑树)、B-Tree、B+Tree

5.Mysql之索引 :回表、索引覆盖、索引下推、MRR、FIC、索引方式、哈希索引

6.Mysql之其他知识  :日志、MyiSAM和InnoDB比较,基础知识体系

 

posted @ 2022-10-10 19:52  湫龙  阅读(35)  评论(0编辑  收藏  举报