一、谈一下对mysql索引的理解
存储引擎、数据结构、索引分类、所因涉及到的名词、执行计划、索引优化
索引的数据结构是通过B+树或者hash表生成的,不同类型的索引是和我们的存储引擎相关的,如果使用的是MyISAM或者InnoDB存储引擎索引底层的数据结构是B+树,而如果使用Memory存储引擎数据结构是hash表。之所以不同的存储引擎对应的数据结构不同是因为不同的存储引擎表示的是不同的数据在磁盘上的组织形式。
MyISAM或者InnoDB存储引擎索引底层的数据结构是B+树是因为索引的数据存储方式是key-value结构的,key是索引的某个列的值,value是一行的记录。key-value格式可以用hash表、二叉树、avl树、红黑树、B+树等等,使用任何形式的二叉树不可避免的会让树变高,树变高就会影响整体I/O的次数从而影响数据返回的效率。所以使用B+树这样的数据结构让每个数据节点中尽可能多的存储数据,让叔的高度变低,减少I/O的次数从而提高访问的效率。
同时MySQL中有主键索引、组合索引、唯一索引、全文索引、普通索引等各种分类,用的更多的可能是主键索引和组合索引,主键索引和组合索引会存在一系列的回表、覆盖索引、最左匹配索引下推等。同时在执行SQL语句的时候可以通过Explain来查看是否使用了索引来对SQL语句进行优化,提高对数据库的访问效率。
1、存储引擎
存储引擎就是数据在磁盘上的不同组织形式
MySQL的数据文件有xxx.frm xxx.ibd xxx.MYI xxx.MYD
.frm文件存储的是表的结构
.ibd存储的是数据,表示使用的是InnoDB存储引擎
.MYI存储的是索引信息,表示使用的是MyISAM存储引擎
.MYD存储的是数据,表示使用的是MyISAM存储引擎
因此可知对于不同的存储引擎可能有同样的数据结构,但是在磁盘上进行实际存储的时候表文件名称、格式都是不同的。例如:在InnoDB中索引与数据是存在一起的,在MyISAM中索引与问数据是分开存储的
InnoDb支持事务、外键,MyISAM不支持
InnoDB支持表锁和行锁,MyISAM只支持表锁
索引的存储方式不同
InnoDB支持自适应hash
