Mysql简单优化之索引

索引概述

索引是什么?

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

你可能感兴趣的:(Mysql简单优化之索引)