Mysql innodb索引思考

Mysql innodb索引思考
第一个问题:聚集索引和非聚集索引的区别(主键索引和普通索引的区别)

看了很多文章,最后总结如下:
1、首先,聚集索引和非聚集索引针对是主键索引,innodb的主键索引是聚集索引,myIsam的是非聚集索引。
2、Innodb主键索引和辅助索引是2个文件(很关键),当数据发生添加或者修改的时候都会变更
3、其中主键索引的非叶子节点只存储主键信息,只有叶子节点会存储完整的数据行记录。整个数据表就是按照主键索引的大小顺序存储的,因而主键索引又叫聚簇索引。
4、而对于辅助索引,非叶子节点只存储辅助索引对应的索引字段,而叶子节点的data字段存储主键索引的值。所以当我们需要根据辅助索引查找行记录时,需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

第二个问题:每行数据为1K(含主键),主键索引类型为bigint或long类型,问一共可以存储多少数据?
解析如下:
1、innodb每个page为16K
2、子节点:16K/1K = 16行数据(即16行索引)
3、上层页节点:bigint或long类型 为8字节(byte),每个指针大小为6字节(64位系统),一共为14字节,16K乘以1024除以14B =1170,1170代表索引段数
4、即2层结构一共可以存储数据量为 1170段乘以每段16行 =18720行
同理:
3层结构一共可以存储数据量为 根1170段乘以叶节点1170段乘以子节点每段16行 =21902400行(约2000W)
注:磁盘的IO次数,和树的高度成正相关,一般情况下innodb三层就满足需求了,三层代表要三次I/O

第三个问题,索引究竟锁的是什么?
InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。
InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

你可能感兴趣的:(面试相关总结)