Mysql优化之索引

1.索引 index

关键字与数据位置关系映射关系,称之为索引

关键字:从数据中提取,用于标识,检索数据的特点给内容。
目的:加快检索
索引为什么快?

  • 关键字相对于数据本身,数据量小
  • 关键字都是排序的

Mysql中索引类型

支持:普通index索引,唯一unique index 索引,主键primary key 索引,全文fulltext index 索引

不同类型,仅仅对关键字的限制不同,其他方面都一致。
普通索引:对索引关键字没限制。
唯一索引:要求记录提供的关键字不能重复
主键索引:要求关键字不能重复,同时不能为null

索引的管理语法

创建索引,删除索引,查看索引

  1. 查看索引
show create table table_name

查看建表语句是确定索引。
查看建表语句是确定索引
也可以看到部分索引:

desc table_name

在这里插入图片描述
2. 创建索引

需要在修改表结构,或者创建表时完成。
基于不同的索引类型,会使用不同的语法

create table user_index1(
	//主键索引,自动增长与业务逻辑无关的id
	id int auto_increment primary key,
	first_name varchar(16),
	last_name varchar(16),
	sh varchar(16),
	information text,
	//创建一个基于first_name,last_name上的复合普通索引,并命名为name
	key name(first_name,last_name),
	//创建了一个基于sn的唯一索引,没有指定名字,默认以字段名命名索引
	upique key (sn),
	//全文索引,鸡肋产品,
	fulltext key (information)
)engine_myisam;

在这里插入图片描述

  1. 删除索引

删除主键索引

alter table drop primary key;

利用索引名字可以删除,普通,唯一,全文索引

alter table drop key key_name;

删除主键时,通常会伴随者自增长 。自增长还依赖于主键。
需要去掉自增长,再删除主键

 alter table user_index1
 modify id int ,drop primary key;
通常不需要删除主键,设计主键一定与业务逻辑无关 

2.执行计划

explain

在这里插入图片描述

在执行的select前,使用关键字explain ,
可以获取该查询语句的执行计划。

执行计划是:当执行SQL的时候,先分析、优化,形成执行计划,按照执行计划执行。

3.索引使用场景

建立的索引,会在哪些情况下被使用,根据这些情况,建立索引

导入测试数据
 calss班级,studen学生,与班级之间为多对一关系

在这里插入图片描述
在这里插入图片描述

  1. where查询
    当前表只有一个主键索引,查寻计划在主键上
    在这里插入图片描述
    查询没有索引的字段
    在这里插入图片描述
    在没有字段的索引上索引,再次查寻

在这里插入图片描述

  1. order by 排序
    当使用某个字段排序时,也可以使用到该字段上的索引

在没有索引的字段进行排序测试:
在这里插入图片描述
filesort:外部排序,相对于内部排序来说的,性能较低,需要将数据读取到内存,但是不能一次读完,需要分段读取,合并排序结果。

增加排序字段的索引。在测试:
在这里插入图片描述
在这里插入图片描述
索引可以用来排序的原因,本身就是按照关键字排序存的

  1. join 连接
    在使用join查询的时候,需要在关联字段上建立索引

查询班级内的学生数量:

select c.* ,count (s.id)from class c join student s on c.id=group by c.id limit 5;

在关联字段s.class_id 上没有索引,执行查询,执行时间长,没有s.class的索引可用。
在这里插入图片描述
在这里插入图片描述
增加s.calss 的索引
在这里插入图片描述
完成关联表的查询
在这里插入图片描述
在这里插入图片描述

  1. 索引覆盖
    是一个现象
    指的是,索引中提供的关键字覆盖了需要查询的字段数据,此时查询会有索引提供,而不是由数据提供。
    建立一个复合索引
    在这里插入图片描述
select frist_name,last_name from student limit 5;

注意查询的字段列表仅仅由first_name ,last_name
在这里插入图片描述
更改查询字段的组合
在这里插入图片描述

两次查询就差一个user关键字,就不能被覆盖。
建议:在查询时,select后只写必要的字段,被覆盖的可能性提升!

4.语法细节

在满足索引使用场景下,索引也不一定被使用。
主要原因,就是语法不严谨导致!

5.如何创建索引

建立基础索引:在where,order,join 字段上建立索引
优化:

  • 组合索引:基于业务逻辑
  • 如果条件经常出现在一起,多字段索引,升级为复合索引。
  • 如果通过增加个别字段,就可以出现索引覆盖,增加个别字段
  • 查询时,不会用到的索引,应该删除掉。
  • 有些字段,是否可以使用前缀即可完成标识,改用前缀索引

6. 前缀索引

语法:
index(field(10))
使用字段field的前19个字段建立索引,默认是使用字段的全部内容建立索引。

前缀的标识度,足够的情况下,需要使用前缀索引
例如:密码字段,就适合使用前缀索引
实操的难度,在于前缀的长度。需要分析,多长的前缀,标识度足够:
计算过程如下:
使用总的记录数量除以不重复的记录数量
在这里插入图片描述
除以:
在这里插入图片描述

再使用不同的前准计算标识度:截取,计算

left(字符串,长度),从左侧截取字符
在这里插入图片描述

建立索引时使用前9个最合理:

在这里插入图片描述

使用上与普通索引一致

前缀索引:可以减少关键字的大小,提升索引的遍历速度!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值