索引的概念
索引如同一本图书的目录一样,在数据的搜索中起至关重要的作用,在mysql数据库中,使用N叉树(b+树)作为索引,在innoDB中,表都是根据主键顺序以索引的形式,这种存储方式的表称索引组织表。如果建表语句没有主键,mysql会自动生成一个rowId作为表的主键。主键也被称为聚簇索引(主键索引树的key为主键的值,value为整列的值),其他的索引叫做二级索引(索引值为索引树的key,value为主键的值)
索引维护
索引插入的时候必须要保证它的有序性,因为没有顺序的索引也没有存在的意义,当在一个满的数据页插入数据的时候会造成页分裂,影响索引的性能,原来一个页的数据被分为两个页,空间利用率减少了百分之五十,所以为了防止这种情况,主键索引一般推荐使用自增主键。主键索引的字段长度越小,二级索引的value中的占用的空间就越小
回表
在查询一张表的数据使用二级索引的时候,需要从二级索引树中定位到主键索引,然后返回主键索引中去检索数据,这个过程我们通常称做回表,在索引优化中,可以通过减少回表的过程减少搜索使用时间
索引覆盖
如果一条sql中的查询的字段和where的关键字都在某一个索引中,mysql可以直接使用这条索引中的数据,不需要回主键树回表,可以有效的优化sql,所以在sql中频繁查询的数据,可以建立联合索引来进行索引覆盖,有效减少回表次数
最左匹配原则
在我们建立联合索引如(a,b)的时候,就不需要单独建立一个(a)的索引了,在mysql中,当sql使用到
联合索引最左边字段或者是最左的几个字符的时候,优化器会选择该联合索引作为该sql的索引,所以在我们建索引的过程中,可以判断业务中最常用到的字段放到最左边,减少维护多索引的开销
索引下推
在mysql5.6以后,索引做了优化,如果一条sql的where语句之后的字段有在一个联合索引中,会通过对索引的字段先做判断,过滤掉不符合条件,减少回表次数
唯一索引与普通索引选谁
在innoDB引擎中有change buffer的概念,在更新数据页的时候,如果数据页在内存中的时候,先更新内存,如果不在内存中的时候,在不影响数据一致性的情况下,innoDB会将这些数据更新缓存到change buffer中,在访问该数据页的会发生merge操作。对于写多读少的业务下change buffer的收益变大。而change buffer是对唯一索引不生效的,因为对于唯一索引来说会判断这些更新操作是否违反了唯一性原则,必须要将数据页读到内存中才方便,所以没有必要使用change buffer了
