MySQL底层数据结构


mysql底层数据接结构:B+Tree

为什么索引的数据结构没有选用二叉树?

  二叉树的底层数据原理是  左子元素 < 父元素 < 右子元素   

  列如插入1~7会变成一个链表

  

  假设查找的元素是7  他会先从跟节点找,进行一次磁盘IO,把根节点 load 到内存跟要查到的要素做对比   ,  先把1 load到内存跟要查找的7做对比一看 7>1 然后再去找1的右子树   ~~   直到进行7次磁           盘IO找到7。

 

为什么没有选用红黑树(又叫平衡二叉树)?

  JDK1.8以后 HashMap底层的链表采用的红黑树做优化    

  假设数据量大的时候他的纵向会延长,比如说500万条数据他的树干高度是30的话,万一查找的数据就在叶子节点上  需要经过30次的磁盘IO

为什么选用红B+Tree(btree的变种)?

  磁盘一次IO交互大概是(4K/16K)mysql一个节点是16K(1638)

  B+Tree非叶子节点不存value,只存索引key(冗余),比btree可以放更多的 索引

  叶子节点包含所有索引字段

  叶子节点有双向的指针,提高区间的访问的性能。

  

为什么mysql推荐索引主键是自增Bigint类型?

  Mysql的指针大概占6B bigint 类型的索引占 8b  6+8=14b

  Mysql一个节点是16k   16k/14b = 1170个索引 (一个节点可以存1170个索引)

  假设索引+一条数据占用1K,那么叶子节点可以放16个,那么叶子节点可以放多少呢?如果按照上面的来看公式是 1170 * 1170 * 16 约等于2100万条数据

  而且mysql的根节点是常驻内存的,假设要查找的数据是在根节点上where条件没索引是非常慢的(慢查询),如果where条件有索引那么是毫秒级别就能查出来的(基本两次磁盘IO)

  如果是UUID当主键的话那么存索引的时候需要一个字符一个字符的比较(比字符的ASCII码,国标码)没有直接的int效率高,如果没有加索引那么他在后台会选择唯一字段来维护这张表

  ,如果没有唯一那么他后台会自动生成一个RowId来帮忙维护这张表

Mysql 的数据放在data文件里 (5.7以下的默认在MySql安装目录下)data文件里每个文件对象这Mysql的每一个数据库   .frm存的表结构   .MYI存的是索引 .MYD存的是数据    .ibd存的是索引+数据

Mysql大部分用的存储引擎有两种:

  Innodb:一个文件叶子节点包含索引字段的数据,innodb就是所说的聚集索引(就是索引跟数据在一个文件),支持事务。

  MYSAM:夸两个文件,从 .MYI到 .MYD,这种夸两个文件的就叫非聚集索引不支持事务。

Mysql还有一种Hash索引为什么用的特别少?

  因为hash不能做范围查找 ,假如where条件是 column<5  那么他就跟没加索引一样   但是b+tree叶子节点有双向指针的查找就非常快

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM