MySQL进阶-索引(二)

目录

索引语法

1.创建索引

2.查看索引

3.删除索引

 案例

数据准备:

1.name字段为姓名字段,该字段的值可能会重复,为该字段创建索引。

2.phone手机号字段的值,是非空且唯一的,为该字段创建唯一索引

 3.为profession、age、status创建联合索引

 4.删除name字段的索引

索引-性能分析-查看执行频次

 索引-性能分析-慢查询日志

索引-性能分析-show profiles

profile详情

 索引-性能分析-explain

explain执行计划

语法:

 explain执行计划个字段的含义:

id

select_type

type

possiable key

Key

Key_len

rows

filtered


索引语法

1.创建索引

2.查看索引

3.删除索引

 案例

数据准备:

1.name字段为姓名字段,该字段的值可能会重复,为该字段创建索引。

首先查看索引:

 然后为name字段创建索引:(idx_表名_字段名)

 再次查看索引:(默认为B+树,因为使用的是InnoDB引擎) 

MySQL进阶-索引(二)_第1张图片

2.phone手机号字段的值,是非空且唯一的,为该字段创建唯一索引

首先创建索引:

MySQL进阶-索引(二)_第2张图片

 然后查询索引:

MySQL进阶-索引(二)_第3张图片

 3.为profession、age、status创建联合索引

创建索引:顺序需要注意!

查询索引:

 4.删除name字段的索引

首先查询索引(获取索引名称)如上图

然后删除索引:

drop index idx_user_name on tb_user;

最后再查询索引查看是否删除成功


索引-性能分析-查看执行频次

MySQL客户端连接成功后,通过show [session/global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:

Com后面是七个下划线

MySQL进阶-索引(二)_第4张图片

 数据代表当前数据库的操作次数

进行一次简单的查询后再次查看查询次数以验证

 索引-性能分析-慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。

MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

MySQL进阶-索引(二)_第5张图片

配置完毕后,通过以下指令重新启动MySQL服务器进行测试,查看慢查询日志文件中记录的信息

/var/lib/mysql/localhost-slow.log

首先查询慢查询日志是否开启:

show variables like 'slow_query_log';

MySQL进阶-索引(二)_第6张图片

 然后通过vi编辑器修改mysql 的配置文件

 MySQL进阶-索引(二)_第7张图片

 保存并退出,然后重启mysql服务器:

systemctl restart mysqld

然后重新查询慢查询日志开关是否开启:

MySQL进阶-索引(二)_第8张图片

 然后可以在相应目录下找到慢查询日志

 MySQL进阶-索引(二)_第9张图片

 通过cat localhost-slow.log查看是否有记录

一开始只有数据库的基本文件

查看慢查询日志尾部实时输出的内容:

tail -f localhost-slow.log

 执行语句 select count(*) from tb_sku后

MySQL进阶-索引(二)_第10张图片

 在慢查询日志中会出现该语句的各种信息MySQL进阶-索引(二)_第11张图片

 我们可以通过慢查询日志定位到这些执行较慢的语句进行优化!

索引-性能分析-show profiles

profile详情

show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:

MySQL进阶-索引(二)_第12张图片

 默认profiling是关闭的,可以通过set语句在session/global级别开启profiling:

MySQL进阶-索引(二)_第13张图片

 然后执行一系列的操作

select * from tb_user;

select * from tb_user where id = 1;

select * from tb_user where name = '白起';

然后通过show profiles查看这一系列操作的用时:

MySQL进阶-索引(二)_第14张图片

 可以精确到每一条语句(每一个动作)

show profile for query query_id;

MySQL进阶-索引(二)_第15张图片

 也可以看到每一条语句cpu的耗费情况:

show profile cpu for query query_id

MySQL进阶-索引(二)_第16张图片

 索引-性能分析-explain

explain执行计划

explain 或者 desc命令获取MySQL如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。

语法:

MySQL进阶-索引(二)_第17张图片

 explain执行计划个字段的含义:

id

select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下,id不同,值越大越先执行)。

案例1:

MySQL进阶-索引(二)_第18张图片MySQL进阶-索引(二)_第19张图片

 可以看到上图id并非自增的,都是1,而根据定义,id相同则从上往下执行

语句中的顺序为s,c,sc

explain中的顺序为s,sc,c

因为s要通过中间表sc建立关联与c产生关系

案例2:查询选修了MySQL课程的学生(子查询)

MySQL进阶-索引(二)_第20张图片

由图可知,该子查询执行顺序为c,sc,subquery2(第二个子查询,in括号里),s

select_type

表示select 的类型,常见的取值有simple(简单表,即不用表连接或者子查询)、primary(主查询,即外层的查询)、union(union中的第二个或者后面的查询语句)、subquery(select/where之后包含了子查询)等

type

表示连接类型,性能由好到差的连接类型为

NULL、system、const(主键或者唯一索引)、eq_ref、ref(非唯一性索引)、range、index(用了索引但仍需扫描索引)、all(全表扫描)

possiable key

显示可能应用在这张表上的索引,一个或多个

Key

实际使用的索引,如果为NULL,则没有使用索引

Key_len

表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好

rows

MySQL认为必须要执行查询的行数,在InnoDB引擎的表中,是一个估计值,可能并不总是准确的。

filtered

表示返回结果的行数占需读取行数的百分比,filtered的值越大越好

你可能感兴趣的:(sql,数据库)