mysql底层原理

mysql索引是帮助mysql高效获取的排好序数据结构

 数据结构

  二叉树(左小右大)

   

  缺点:如果是递增或者递减的数据,就会成一个链状,失去了索引的功能

  红黑树

    二叉树的升级版,如果是递增或递减的数据就会做一下优化

     缺点:治标不治本,树高还是很高 i/o 还是多

  Hash表

    在mysql中每一个索引都对应着hash表中的一个hash值,然后mysql就会把hash值和索引的内存地址存储起来(k,v),每次用索引查询的时候,mysql就会把索引通过hash运算,然后得到hash值,  然后就能高效的查到索引的地址(缺点:1.哈希冲突,2.这种结构不适用范围性查找,所以用的不多    只有数据量特别大,而且基本不会用范围性查询)mysql索引支持这种数据结构,只是用的不多

  B-Tree

    增加了横向宽度,索引和data是在一块的所以存索引存的少(相对应B+Tree)

  B+Tree *

    现在mysql索引99%都是用的这种索引  优点 :加大了横向宽度(一个节点大小是16KB,也是左小右大于等于,一个节点对应着一个分支,只有在叶子节点上才存数据地址(MyISAM)(InnoDB存的是主键)。非叶子节点存储的都是冗余的节点。)所以即便是上千万的数据,纵向(树的高度)也不会超过4。所以大大的提高了查找效率。目前mysql索引大多数都是用的这种

              MyISAM

  非聚集索引:索引和数据是分开的 索引的data部分只是索引的地址值(轻量)

          InnoDB(支持事务)

  2.聚集索引:就是索引的data数据部分是表的全部信息(索引和数据在一块),这样就不用在进行 i/o操作了(重量)

  3.InnoDB表必须有主键,如果你不加,他会先找一列合适的作为主键,如果找不到,就会自己建一列主键。因为B+Tree是需要索引来维护的。

  整形主键比其他的主键(eg:UUID)比较起来会更快(因为用索引查找的时候,会比大小),自增是为了在叶子节点上好存储(拆中间的肯定比在末尾加慢了)

 InnoDB和MYISAM类型表物理磁盘存储的区别

 

            

  

原文地址:https://www.cnblogs.com/zbzdqsmh/p/11524306.html