重新认识Database-MySQL①--抉择B+数

76 阅读2分钟

工作许久,但是可能只是简单的使用,基本上也只是网上搜索优化,而缺乏自己的见解。想想需要对底层数据有提升才行,底层实现如何,为啥要这样做,其余的方式为啥就不好?不断对比的方式来认识下数据库。

  1. 从索引(index)开始

索引本质上就是一种已经排好序的数据结构

数据结构

  • hash表
  • 二叉树
  • 红黑树
  • B-Tree树

hash表

image.png

二叉树 image.png

红黑树

image.png

B-Tree树 image.png

hash表,效率可能比B+tree效率更高,但是也存在hash冲突,不支持范围查询。 二叉树,红黑树,B-Tree三种存在高度不确定的问题,磁盘IO会高。故未采用

为什么使用B-Tree(B+Tree)

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

而mysql数据库底层数据结构是B+树。B+tree特点

  • 非叶子节点不存储数据,只存储索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针链接,提升区间访问性

image.png

MySQL中innoDB页的大小默认值为:16384;及16K大小.

mysql> show variables like 'innodb_page_sze';

如果已主键字段来计算bigint 大概8B+6B,一页16K,大概三的高度,就够上千万的数据;故而查询性能在io磁盘来说,还是挺高的,毕竟只有最多三次io。

存储结构如下

image.png InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,图下方为定义在Col3上的一个辅助索引: