Mysql基础知识点《七》

普通索引和唯一索引的选择
业务场景一:是否将唯一字段设置为主键索引

数据中出现了一个字段保证是唯一的,是否高设计这个字段为主键呢?建议不使用,应该创建一个递增的唯一索引。原因是在innodb中主键索引文件和数据文件是同一个,利用递增主键生成的索引树占用内存小,主要表现在,自增主键自身就小,还有就是自增主键是递增的,生成的索引树是紧凑的,而唯一字段相对更大,并且是随机的,生成索引树会造成也的分裂或者合并情况多。

业务场景二:普通索引和唯一索引怎么选择

分析:

  1. 查询分析。对于唯一索引,当我们查找到第一个满足的时候就会返回,对于普通索引查找到第一个满足的情况还需要向下查找,直到查找到不满足为止。这两只之间的差距真的大吗?其实不然,因为数据的读取不是按行来读取的,而是会读取一页的数据,假如所有慢点的数据都在同一页,那么这两者之间的差距微乎其微,但是如果是普通索引,可能会造成需要多一次磁盘IO的情况,不过我觉得概率也是很低的。
  2. 操作分析。在普通索引中,有一个change buffer 。这个change buffer是用来干什么的呢?change buffer是为了减少磁盘的查询IO的。那为什么唯一索引没有呢,因为唯一索引是唯一的,查找的数据必须是在内存中,change buffer无法作用。所以,先得出结论,使用普通索引可能可以减少磁盘IO,而磁盘IO是数据库最昂贵的操作。
change buffer的用途

既然change buffer是作用于普通索引,那么我们就来分析一下其对于普通索引的作用体现在哪里。

  1. insert/delete,当插入的时候,假如数据在内存中,则直接插入内存中,记录redo log。假如数据也不在内存中,不需要读取磁盘,在change buffer中记录下来插入记录,记录插入信息,记录在change buffer 中插入信息。这两条记录记录在redo log中。
  2. update操作,假如数据也在内存中,则直接修改,否则也是记录在change buffer 中。
    那么change buffer 中的记录什么时候更新呢?当下一次的查询操作读取到数据页是,将会先执行change buffer中的操作。
    综上,可以看出change buffe减少了磁盘IO操作。
宕机之后,change buffer中的数据不会丢失吗?

其实change buffer中的数据也会保存在文件中,之后做merge操作,merge操作怎么进行呢?首先从磁盘中读取数据,然后将change buffer中的操作进行,可能是多个操作,之后再记录redo log记录chang buffer和数据的变更,此时内存中的数据是最新的,但是磁盘中的数据还未更新,需要刷回磁盘。前面也提到了,在进行操作的时候会记录redo log,所以chang buffer的操作也是被记录的,数据不会丢失。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容