美文网首页
mysql 索引相关知识总结:

mysql 索引相关知识总结:

作者: Easy的幸福 | 来源:发表于2019-07-19 17:58 被阅读0次

索引是帮助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冲突

相关文章

网友评论

      本文标题:mysql 索引相关知识总结:

      本文链接:https://www.haomeiwen.com/subject/cugslctx.html