MySQL索引

什么是索引?

描述 : 为表设置索引,会按照设置的索引生成索引文件,查询时通过索引文件来查询,从而提高查询速度

作用 : 可以大大提高查询速度

副作用 : 会降低更新表(insert,update,delete)的速度,因为更新表时,mysql不仅要保存数据,还要保存索引文件

索引分类 : 单列索引(多个单列叫多列索引)和组合索引, 单列索引:一个索引只包含单个列, 组合索引:一个索引内有多个列

怎么使用 : 在WHERE后边使用有索引的字段作为条件语句

索引类型

1.普通索引(INDEX)

特性 : 没有任何限制,可以重复

创建索引 : CREATE INDEX 索引名 ON 表名 (字段名(length))

修改表结构添加索引 : ALTER TABLE 表名 ADD INDEX 索引名(字段名(length) )

创建表的时候指定索引 : CREATE TABLE testtable(id int primary key, ... , INDEX [索引名] (字段名(length))  );

删除索引 : DROP INDEX 索引名 ON 表名

创建组合索引 : ALTER TABLE 表名 ADD INDEX 索引名(字段1(length), 字段2(length), ... )

2.唯一索引(UNIQUE INDEX)

特性 : 索引的值必须唯一,如果是组合索引,则组合索引必须唯一,单个列的值不必唯一.

创建索引 : 同上普通索引, 把INDEX改成UNIQUE INDEX即可,修改表结构添加索引,建表时添加索引时可以只用UNIQUE

3.全文索引(FULLTEXT INDEX)

省略

4.多列索引

MYSQL在查询时,将选择一个限制最为严格的索引使用

5.组合索引(最左前缀)

最左前缀 : 查询条件要按照索引的从左到右的顺序使用,否则不会使用索引

  比如创建了组合索引 : ALTER TABLE mytable ADD INDEX index_name_sex (name(24), sex(1)  )

  实际上在查询时只有两种组合会用到索引,分别是:

    name, sex

    name

  其他的排列顺序就不会使用索引,比如sex, name 或者 sex

  不使用索引的例句 : SELECT * FROM mytable WHERE sex=1 AND name='zhangsan';

聚集索引和非聚集索引

一.聚集索引和非聚集索引的定义

 MySQL, InnodDB存储引擎下:

  默认主键为聚集索引,如果没有设定主键,则第一个唯一索引作为聚集索引.如果也没有唯一索引,innoDB会隐式定义一个6字节的rowid主键来作为聚集索引

  除聚集索引外的索引,是非聚集索引

二.聚集索引

聚集索引就像是字典里的拼音目录

一张表只有一个聚集索引,(默认就是主键)

  数据在磁盘中的物理地址排列方式,与聚集索引的顺序相同,如果我们查询id靠后的数据,那么这个数据的物理地址也靠后

  如果在数据中间部分插入一个新的数据,那么后边的数据物理位置全都要改变!

三.非聚集索引

非聚集索引就像是字典里的偏旁索引,索引的顺序未必就是数据的排列顺序.

BTREE索引和HASH索引

不同的引擎对于索引有不同的支持:InnoDB和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引

BTREE索引

Btree索引是以B+树为存储结构实现的,Innodb和MyISAM默认的索引是Btree索引

但InnoDB和MyISAM所使用的Btree存储结构有很大不同

一.MyISAM

 1).MyISAM的主索引

  上图是MyISAM主索引的结构图, 以Col1作为主键,我们看这棵树的叶节点保存的是数据的物理地址

  在MyISAM中,主索引和辅助索引在结构上没有任何区别,唯一的区别是主索引要求key唯一,而辅助索引的key可以重复

2).MyISAM的辅助索引(在Col2上建立的)

上图可见,MyISAM下,主索引和辅助索引的索引结构没有不同.都是在叶节点保存数据的物理地址

所以,MyISAM中检索索引的方法是

  1.按照Btree搜索算法搜索索引,如果key存在,则取出起data域的值

  2.以data域的值为地址,读取对应的数据.

MyISAM的索引文件和数据文件(表)是分离的

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分

二.innoDB

innoDB存储引擎下,数据文件本身就是索引文件,表本身就是主索引,辅助索引文件其实也是一张表

1).innoDB下的主索引

 

上图可见,innoDB的主索引(同时也是数据文件)的叶节点包含了完整的数据,这种索引叫聚集索引(以主键作为索引),因为innoDB的数据文件本身要按照主键聚集,所以innoDB要求表必须有主键.而innoDB的辅助索引和主索引不同.

2).innoDB的辅助索引

上图可见,innoDB的辅助索引保存的是主键的值,使用这种索引需要检索两遍索引

  1.首先检索辅助索引获得主键.

  2.然后用得到的主键在主索引中获取数据.

BTREE索引总结

1.innoDB主索引是聚集索引,因为数据要按照主键聚集. 而innoDB的辅助索引和MyISAM的主索引和辅助索引则是非聚集索引.

2.innoDB的主索引的索引文件就是表本身,保存完整数据,辅助索引保存的是主键id,MyISAM的主索引和辅助索引都保存的是数据的物理地址,唯一的区别是主索引的key必须唯一

3.使用innoDB存储引擎,表必须要有主键, 而使用MySIAM存储引擎,表没有主键也不影响.

4.使用索可以引消除排序,order by按照索引来写即可.(可以提高速度)

 

Hash索引

先不写,以后有需要了再来写

 参考文章: 

https://www.cnblogs.com/shijingxiang/articles/4743324.html

https://www.jianshu.com/p/bf30c2b9a0cf

f

posted @ 2019-05-12 16:05  Kaneha  阅读(180)  评论(0编辑  收藏  举报