环境:mysql.5.6.40

1.png

mysql索引_第1张图片

索引原则:

1.选择唯一性索引

2.为经常需要排序、分组和联合操作的字段建立索引

3.为常作为查询条件的字段建立索引

4.限制索引的数目

5.尽量使用数据量少的索引

6.尽量使用前缀来索引

7.删除不再使用或者很少使用的索引


1、索引类型(默认索引方法是BTREE)

1.1、normal

    表示普通索引,大多数情况下都可以使用

 比如:

普通索引:mysql> alter table axublog_navs add index index_name(type);

组合索引:mysql> alter table axublog_navs add index index_name(id,type);

组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则

1.2、unique

   表示唯一的,不允许重复的索引;约束唯一标识数据库表中的每一条记录,即在单表中不能用每条记录是唯一的(例如×××就是唯一的),Unique(要求列唯一)和Primary Key(primary key = unique + not null 列唯一)约束均为列或列集合中提供了唯一性的保证,Primary Key是拥有自动定义的Unique约束,但是每个表中可以有多个Unique约束,但是只能有一个Primary Key约束。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

比如:

    mysql> alter table axublog_navs add unique(typ);

    mysql> alter table axublog_navs add primary key(id);


1.3、full textl

   表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。

比如:mysql> alter table axublog_navs add fulltext(name);


总结:索引的类别由建立索引的字段内容特性来决定,通常normal最常见

2、索引方法

2.1、HASH方法

(1)Hash 索引仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询。

由于Hash索引比较的是进行Hash运算之后的Hash值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的Hash算法处理之后的Hash。

(2)Hash 索引无法被用来避免数据的排序操作。

由于Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。

(3)在任何时候都不能避免表扫描。

    由于Hash索引比较的是进行Hash运算之后的Hash值,所以即使取满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(4)检索效率高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash索引的查询效率要远高于B-Tree索引。

(5)只有Memory引擎支持显式的Hash索引,但是它的Hash是nonunique的,冲突太多时也会影响查找性能。Memory引擎默认的索引类型即是Hash索引,虽然它也支持B-Tree索引。

2.2、B-Tree方法

(1)B-Tree是最常见的索引类型,所有值(被索引的列)都是排过序的,每个叶节点到跟节点距离相等。所以B-Tree适合用来查找某一范围内的数据,而且可以直接支持数据排序(ORDER BY)。

(2)B-Tree在MyISAM里的形式和Innodb稍有不同:

   InnoDB表数据文件本身就是主索引,叶节点data域保存了完整的数据记录。

  MyISAM表数据文件和索引文件是分离的,索引文件仅保存数据记录的磁盘地址。