mysql的主要索引innodb和misam

innodb:
根据存储引擎的不同索引的实现也不同,基于B+树数据结构实现的索引比较多,也有hash索引,根据不同的场景应用不同。

接下来描述下innodb存储引擎,innodb的主键索引是在b+树的叶子节点存储的是数据本身,辅助索引叶子节点存储的数据是主键的值,当用辅助索引查询值的时候会找到主键的值,再去主键索引的B+查询一遍。    因为主键索引叶子结点存放的是全部数据,所以也就是聚簇索引。

 

在innodb中,表数据文件本身是按照B+ Tree组织的一个索引结构,在data域存放了完整的数据记录,key是数据的主键,所以innodb表数据文件的本身就是主索引。

在innodb中必须要有主键,如果没有显示的指定主键,Mysql系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则mysql自动为innodb表生成一个隐含字段作为自增主键,这个字段占用6个字节,是长整型类型。

 

MyISAM:
在MyISAM中的索引是非聚簇索引,叶子结点(data域)存放的数据的地址而不是数据本身,当访问数据的时候要到数据存放的地址中去取数据。    在MyISAM中 主索引和辅助索引在结构上没有区别 data域存放 是数据的地址, 区别是主索引要求Key是唯一的,辅助索引的Key是可以重复的。

 

以上是InNoDB存储引擎的索引 的区别。

 

Innodb存储引擎索引需要注意的点:

  • 不要使用过长字段作为主键,因为辅助索引的域值存放的是主键,过长的主键字段会使得辅助索引变得过大。
  • 不要用非单调的字段作为主键,在innodb中数据文件本身就是一颗B+树,在插入新记录的时候数据文件为了维持B+树的特性需要不断的分裂合并调整,非常的低效。  使用自增字段作为主键效率会非常的高。 

 

两个存储引擎除了索引区别其他地方也有区别:

  • InNoDB支持事物,MyISAM不支持事物,对于Innodb每条sql语句都会默认的封装成事物进行提交,当每条语句都是一个事物,执行的时候会影响效率,可以将多条sql 语句放在begin 和 commit 之间,组成一个事物;
  • Innodb支持外键,Myisam不支持外键
  • Innodb支持行锁     Myisam支持表锁

 

在应用上:

如果表的修改要求较高的事物处理,可以选择Innodb存储引擎。

如果查询较多的表可以选择Myisam存储引擎。

 

 

 

索引有唯一主键索引、自增主键索引、辅助索引、覆盖所以、组合索引、

还有索引下推机制

回表:
当在辅助索引查询一个范围的值的时候,会在辅助索引查询到符合条件的记录,再去到主键索引查询对应主键的data域的值。由于有的例子需要查询的数据只有主键索引上有,所以不得不回表。回到主键索引搜索的过程,称为回表,辅助索引查询一次符合条件就会回到主键索引,这就是一次回表,查询多次多次符合条件就会回表多次。

覆盖索引:
如果查询语句 select id form t where k between 2 and 5 ,这个时候只需要查询id的值,id的值如果在 k 这个辅助索引的索引树上,可以直接提供查询的结果,不需要回表,辅助索引 k 已经覆盖了我们的查询需求,成为覆盖索引。     

tip,用关键字key和index都可以创建索引

联合索引:
当有一个高频的查询,通过学号查询名字,可以将学号和名字建立联合索引,高频的查询请求用到了覆盖索引,不需要进行一个回表,减少了查询语句的执行时间。

最左前缀原则:
查询名字的时候,比如查询名字第一个开头的字是李,"where name like '李%' ", 然后找到第一个符合条件的结果,向后遍历,知道不满足条件为止。只要满足最左前缀就可以按利用索引快速的检测,最左前缀可以是联合索引的前N个字段,也可以是字符串索引的前K个字段。

索引下推:
在mysql的5.6版本之后,出现了索引下推优化(index condition pushdown)。
一个例子,如果要查询学校里姓闫的年龄小于20岁的男生的所有信息,用到索引下推的优化会减少回表的次数。
在索引遍历的时候会对索引包含的字段作出判断,过滤掉不满足条件的记录,比如联合索引的名字中带闫且年龄>=20的的记录直接过滤掉, 减少了回表的次数。