Mysql简单优化之索引

Mysql概述

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。
MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

Mysql存储引擎

1、查看mysql当前的存储引擎

mysql> show engines;

在这里插入图片描述可见mysql目前除了FEDERATED存储引擎不支持外,支持其他8中引擎,其中常用的的是InnoDB 和MyISAM。
2、InnoDB 和MyISAM这两种主流存储引擎的区别
在这里插入图片描述
3、查看mysql默认引擎

mysql> show variables like '%storage_engine%';

在这里插入图片描述
可见当前mysql的存储引擎是InnoDB

索引概述

索引是什么?

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
可以得到索引的本质:索引是数据结构。
我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。其中聚集索引,次要索引,覆盖索引,
复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。

mysql索引分类

1、单值索引
一个索引只包含单个列,一个表可以有多个单值索引
2、唯一索引
索引列的值必须唯一,但是可以为null
3、复合索引
一个索引包含多个列

基本语法

创建索引:有两种方式

第一种方式:

create index indexName on tableName (columnName);

第二种方式:

alter table tableName add index indexName on (columnName);
删除索引
drop index indexName on tableName;
查看索引
show indexName from tableName\G
使用alter创建索引有以下四种方式

1、第一种方式:
直接创建主键,因为主键本身就是索引,在我们平时创建表结构时,总是习惯的将表中id设为主键,因为大多数情况下我们都会通过id来进行数据库的增删改查,其实id本身就是索引,所以大多数情况下通过id来进行增删改查是正确的行为。须知道主键为索引值是唯一的,且不能为null。

alter table tableName add primary key (columnName);

2、第二种方式:
创建unique索引,索引值必须是唯一的。

alter table tableName add unique indexName (columnName);

3、第三种方式:
创建普通索引,索引值可以出现多次

alter table tableName add index indexName (colunname);

4、第四种方式
指定索引为FULLTEXT,用于全文索引

alter table tableName add fulltext indexName (columnName);

通过explain来查看mysql中查询的type等级

type类型

type显示的是访问类型,是较为重要的一个指标。
从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL
一般来说,得保证查询至少达到range级别,最好能达到ref
在这里插入图片描述

  1. All:Full Table Scan,将遍历全表以找到匹配的行
  2. index:Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。
    (也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)。
  3. range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引
    一般就是在你的where语句中出现了between、<、>、in等的查询。
    这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
  4. ref:非唯一性索引扫描,返回匹配某个单独值的所有行.
    本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,
    它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
  5. eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
  6. const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快
    如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
  7. system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计。

通过id查询执行顺序的三种情况

1、id相同,执行顺序由上而下
下面的三个table id值相同,则按照 t1、t3、t2执行
在这里插入图片描述
2、id不同,如果是子查询的话,id的序号会递增,id的值越大优先级越高,越先被执行
下面的三个table 则按照t3、t1、t2执行在这里插入图片描述
3、存在id既有相同的,也有不同的
相同的为一组,组中按照由上而下执行,在所有组中,id值越大的越先被执行
下面的三个table ,则先执行t3,再执行衍生表,最后执行t1

在这里插入图片描述
未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值