索引概述
索引是什么?
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
可以得到索引的本质:索引是数据结构。
我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。其中聚集索引,次要索引,覆盖索引,
复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。
mysql索引分类www.weixiu3721.com
1、单值索引
一个索引只包含单个列,一个表可以有多个单值索引
2、唯一索引
索引列的值必须唯一,但是可以为null
3、复合索引
一个索引包含多个列
基本语法
创建索引:有两种方式
第一种方式:
create index indexName on tableName (columnName);
1
第二种方式:
alter table tableName add index indexName on (columnName);
1
删除索引
drop index indexName on tableName;
1
查看索引
show indexName from tableName\G
1
使用alter创建索引有以下四种方式
1、第一种方式:
直接创建主键,因为主键本身就是索引,在我们平时创建表结构时,总是习惯的将表中id设为主键,因为大多数情况下我们都会通过id来进行数据库的增删改查,其实id本身就是索引,所以大多数情况下通过id来进行增删改查是正确的行为。须知道主键为索引值是唯一的,且不能为null。
alter table tableName add primary key (columnName);
1
2、第二种方式:
创建unique索引,索引值必须是唯一的。
alter table tableName add unique indexName (columnName);
1
3、第三种方式:
创建普通索引,索引值可以出现多次
alter table tableName add index indexName (colunname);
1
4、第四种方式
指定索引为FULLTEXT,用于全文索引
alter table tableName add fulltext indexName (columnName);
1
通过explain来查看mysql中查询的type等级
type类型
type显示的是访问类型,是较为重要的一个指标。
从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。
All:Full Table Scan,将遍历全表以找到匹配的行
index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。
(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)。
range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引
一般就是在你的where语句中出现了between、<、>、in等的查询。
这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
ref:非唯一性索引扫描,返回匹配某个单独值的所有行.www.weixiu3721.com
本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,
它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快
如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计。
通过id查询执行顺序的三种情况
1、id相同,执行顺序由上而下
下面的三个table id值相同,则按照 t1、t3、t2执行
2、id不同,如果是子查询的话,id的序号会递增,id的值越大优先级越高,越先被执行
下面的三个table 则按照t3、t1、t2执行
3、存在id既有相同的,也有不同的
相同的为一组,组中按照由上而下执行,在所有组中,id值越大的越先被执行
下面的三个table ,则先执行t3,再执行衍生表,最后执行t1