mysql 索引

mysql 索引

索引是帮助Mysql高效获取数据的而且已经是排好序的数据结构

索引数据结构一般有以下几种:

  • 二叉树
  • 红黑树
  • hash表
  • B(+)Tree

推荐一个外国的网站学习数据结构:

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

 

红黑树相较于二叉树,可以自动旋转至左右子树平衡,高度差不超过1,降低了树高,减少了磁盘的读取次数,节省了查找时间。

当数据量过大,即使红黑树,树高也不可控 ,由于数据库查找索引,每遍历一个节点,都要进行一次磁盘IO读取数据,由于磁盘IO读取数据比较慢,显得查找效率依然不是特别高。

有没有什么办法能够大大降低树高,而且可控,这样就提高了查找效率,查找索引的时间就稳定于是引出了B树,相当于二叉树的横向扩展,一个子节点存储多个索引,数据库在查找索引的时候,把这个节点的索引全部加载到内存中,然后在查找比较,这样效率就提高了很多。

B树:

mysql 索引

 

 

 然而mysql底层用的是B树的一个变种叫B+树;

  • 非叶子节点不能存储data,只能存储索引,这样一个节点就可以存放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针连接,提高了区间访问的性能 

mysql 索引

 

 

MYISAM存储引擎索引的实现

  MyISAM的索引文件和数据文件是分离的(非聚集)

  使用show global variables like "%datadir%";查看数据库数据存放位置

mysql 索引

 

在MyIsam中,数据文件有两种,MYD文件存储的是数据,MYI文件存储的索引,使用MyIsam数据库引擎进行查找时,会先去MYI去查找索引,找到后采取MYD获取数据。

 

InnoDB索引实现

InnoDB叶子节点的索引和行数据存放在一起(聚集表),都放在ibd文件中

mysql 索引

 

 

 一般情况下,为什么Innodb的效率更高,因为根据索引查找数据时,MyIsam需要查找两个文件,而Innodb只需要到1个文件中查找就行了,少了一次磁盘IO操作。

 

mysql 索引

上一篇:yum安装CentOS7+nginx+php7.3+mysql5.7


下一篇:针对mysql的后台语句执行读取敏感信息