索引是帮助mysql高效获取数据的排好序的数据结构,索引是存在硬盘上的 。
每一次查询mysql 就是一次磁盘io.
红黑树其实是二叉平衡树,如果数据足够大的话,那么红黑树的层数(树的度)会很深。这也是之所以不被数据库使用的原因。
BTREE 其实是多叉平衡树(一个节点存储了多个节点(多个索引))。
mysql使用的索引其实是 B+Tree(BTree的变种树)。B+Tree一般为三层到五层之间。
B+Tree:叶子节点存储数据,非叶子节点存储数据的索引值,每个叶子节点之间通过箭头(指针)相连接。
为什么B+Tree叶子节点存储数据?
cpu每次都是从硬盘数据读入内存,磁盘的最小单元是 页。一页默认存储16K,每次读取只能取整页的。
msyql每个节点默认存储一页的数据,一个索引默认大约是6B。(show GLOBAL STATUS LIKE 'Innodb_page_size';这条sql可以查询大小)。
mysam存储引擎:
磁盘上对应三个文件(frm,myd,myi)结尾的。frm 对应的是表结构,myd存储数据,myi存储索引。
Innodb存储引擎:
磁盘上对应两个文件(frm,ibd)结尾的。frm对应表结构,ibd存储指针和数据。
innodb的特性:ibd本身就是一个B+Tree结构的文件。
为什么innodb建议必须有主键?
表结构决定了必须有,ibd文件。之所以没有主键也能建表成功,是因为msyql默认会建一个字段当做主键。
为什么主键建议用整形且自增?
uuid作为主键,第一占内存,第二值不连续,可能导致B+Tree分层,第三比较,整形快。
联合索引底层存储结构:(最左前缀)
叶子节点其实冗余了索引地址,根据B+Tree树的特性都是从左到右递增的。并且B+Tree是根据最左边的字段构建的
聚集索引:叶子节点包含了完整的数据记录。(主键索引就是据聚集索引)
非聚集索引:就是数据元素和索引不在同一个文件中存储的索引。(mysam:的两个文件)。(待确定)
Hash索引:
a)、Hash索引是基于Hash表实现的,只有查询条件精确匹配Hash索引中的列时才能够使用Hash索引。
b)、对于Hash索引中的所有列,存储引擎都会为每一行计算一个Hash码,Hash索引中存储的就是Hash码。
Hash索引的限制:
a)、Hash索引中包含的只是Hash码与行指针,因此必须进行二次查找。
b)、Hash索引的建立是由Hash码构成的,因此Hash索引无法用于排序。
c)、Hash索引不支持部分索引查找也不适合范围查找。
d)、Hash索引中Hash码的计算可能存在Hash冲突。
网友评论