下面对innodb存储引擎中的索引部分做一个简单的总结:
1、inonodb的存储引擎索引
支持两个常见的索引,一个是b+树的索引,一个是哈希索引。哈希索引是自适应的哈希中使用的,B+树索引是常见的数据索引
2、innodb索引的优缺点
缺点:
索引都是创建临时表,数据导入临时表,然后删除原表,然后重命名表,所以索引的创建和删除都是非常费时的。
优点:
索引的查找是非常方便的
3、索引中b+树是如何利用的,聚集索引和非聚集索引,对于B+树有何不同?
B+树中对于聚集索引与非聚集索引,所有b+索引叶子节点都不能找到一个给定键值的具体行,是根据索引找到了被查找行所在的页,然后把这个页读入到缓存中,在内存中进行查找,最后得到查找的行。
B+索引,将索引用b树的形式进行逻辑组织,然后用户给 一个索引,在b+树上通过二分查找去查找索引,直到目标的叶子节点匹配索引,然后读取这个叶子节点。
注意:每层的节点都是在磁盘中,都需要从磁盘读到内存中。
对于聚集索引:叶子节点存放的是数据页信息、
对于非聚集索引:叶子节点存放的是数据页的偏移地址,即一个书签,标明 了索引的相对行的地址。进一步理解:非聚集索引的叶子节点实际包含一个聚集索引,如果非聚集索引找不到需要的值这个时候就会通过聚集索引再去找一次。
4、什么时候MySQL使用索引呢?
如果某个字段的取值范围很广,几乎没有重复,即高选择性,则此时B树索引最合适
当出现了高选择字段,同时从表中取出的行较少时,满足即可。
5、就上面的问题,那么为什么要取出行较少的时候使用索引呢?如果较多的时候则不会呢?
因为当取的表行较多的时候,这个时候可能出现非聚集索引与聚集索引的交叉使用,这个时候造成大量的离散度,这个时候可能不如进行一个全盘的顺序读,而不是使用索引。
例如直接遍历,select一个性别。
6、那么对于select操作,数据库什么时候选择聚集索引,什么时候选择非聚集索引呢?
innodb总是先去访问非聚集索引,因为非聚集索引效率更高,看非聚集索引的叶子节点信息中是否已经找到需要的数据,如果没有找到,还需要去访问包含的主键信息,在进行聚集索引,找到所需要的行。
如果涉及到order排序操作的话,首先会直接选取聚集索引
普通的查找会优先选择非聚集索引, 因为非聚集索引叶子节点存放的数据量比聚集索引多。
7、innodb中对于哈希索引中哈希参数的选择
内存缓存查找LRU,使用了哈希方法加快查找的速度
哈希冲突解决采用链表的方法,哈希函数采用散列的方式