mysql-innodb初步了解(二)
索引
innodb中索引一般都是Btree的实现的,就是B+树。索引跟数据都是存储在B+数上,对于数据树来说,叶子节点上是数据行构成的数据页,节点上都是主键索引;对于索引树来说,叶子节点上是主键索引值,节点上是非聚集索引值,索引页跟数据页上的不管是叶子节点还是非叶子节点,都是16K大小,所以索引字段长度越小,能存放的索引记录越多。
一般我们用索引查询数据的流程是:先从索引中查询到叶子节点,找到命中索引的主键值,然后再从数据树中根据主键值找到对应的数据页,如果我们权标扫描的话,就会有大量的IO出现,导致慢查询场景,索引我们用索引,但是索引使用也是需要考虑的。如果索引的区分度不大,也就是一个索引命中的数据很多,那么索引的效果就不明显,相反还可能因为从索引中获取主键后再去查询数据,因为离散读取导致查询更慢(MMR能优化这个场景)
一般当需要由排序的要求时,优先考虑联合索引,把查询字段跟排序字段构建成联合索引,并且把排序字段放在最后,这样可以利用索引的排序特性避免一次排序,否则出现filesorting,数据查询会很慢。
force index可以强制使用哪个索引,但是不建议用,因为mysql能够很好的优化。
mysql中索引有几种:聚集索引,唯一索引,联合索引,普通索引
聚集索引: 主键索引,数据库中的数据是按照主键的顺序存储的,就是数据树里面非叶子节点内的值都是主键值,主键是唯一的。
唯一索引: 跟普通索引的区别是索引的值是唯一的,但是属于非聚集索引
普通索引: 相比于唯一索引来说,允许索引的值有多个
联合索引: 多个数据列构成一个索引,一般根据使用场景构建
覆盖索引: 当我们搜索的字段在索引中存在时,就不需要再去查询数据表了,所以在构建索引的时候要结合业务场景选择,如果查询的字段通过索引树就能确定,就不需要回表进行二次查询了。