乐趣区

mysql索引

基本知识点:

  • 索引是在存储引擎层实现的
  • MyISAM 引擎和 Innodb 引擎都使用 B +Tree 作为索引结构,但是底层实现还是有些不同的
  • 索引一经创建不能修改,如果要修改索引,只能删除重建。
  • Innodb 索引和数据存储在同一个文件,MyISAM 索引文件和数据文件是分离的。

索引按照功能分为:

主键索引,唯一索引,普通索引,前缀索引,全文索引

创建主键索引:alter table table_name add PRIMARY KEY (`column`) // 主键索引可以包含多个列 
创建普通索引: alter table table_name add index index_name(column);
创建唯一索引:alter table table_name add UNIQUE index index_name(column);
创建前缀索引:alter table table_name add index index_name(columns(6)); // 只能是字符串字段 
创建全文索引:alter table table_name add FULLTEXT index index_name (column);//Mysql 全文索引是专门为了解决模糊查询提供的,但是开销很大 
删除索引:drop index index_name on table_name;

按照索引的字段个数:

单列索引,联合索引;
其中 联合索引满足最左匹配原则
如索引是 key index (a,b,c). 可以支持 a | a,b| a,b,c 3 种组合进行查找,但不支持 b,c 进行查找。对于 a,c, 只走 a 字段索引,不会走 c 字段。

按照磁盘存储来区分:
聚簇索引,非聚簇索引
聚簇索引可认为是磁盘将实际数据按照定物理地址进行顺序存放,并且与索引的顺序是一致的。那么当索引是相邻的,对应的数据一定也是按照相邻的顺序存放。


【MyISAM 的主键索引和辅助索引】


由上图可以看到:

1. 在 MyISAM 中,索引的数据结构是一颗 B +Tree
2. 在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索引的 key 可以重复。
3. 在 MyISAM 中,叶节点的 data 域存放的是数据记录的地址。
因此,MyISAM 中索引检索的算法为首先按照 B +Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址,读取相应数据记录。
MyISAM 的索引方式也叫做“非聚簇”的。


Innodb【主键索引】【非主键索引】

  • 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
  • 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。二级索引存储 索引字段值与主键,二级索引查找数据需要回表到主键树上查处记录。

【显然,主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小;
非主键索引的查询数据需要多扫描一棵索引树,因此,我们在应用中应该尽量使用主键查询数据;】

聚簇索引:InnoDB 的主键

非主键索引:唯一索引、普通索引等 ……

Mysql5.6 及之后版本添加了 索引下推 这个优化,减少二级索引的回表操作。(只作用在二级索引)

退出移动版