目录
索引语法
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
首先查看索引:
然后为name字段创建索引:(idx_表名_字段名)
再次查看索引:(默认为B+树,因为使用的是InnoDB引擎)
首先创建索引:
然后查询索引:
创建索引:顺序需要注意!
查询索引:
首先查询索引(获取索引名称)如上图
然后删除索引:
drop index idx_user_name on tb_user;
最后再查询索引查看是否删除成功
MySQL客户端连接成功后,通过show [session/global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:
数据代表当前数据库的操作次数
进行一次简单的查询后再次查看查询次数以验证
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。
MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
配置完毕后,通过以下指令重新启动MySQL服务器进行测试,查看慢查询日志文件中记录的信息
/var/lib/mysql/localhost-slow.log
首先查询慢查询日志是否开启:
show variables like 'slow_query_log';
然后通过vi编辑器修改mysql 的配置文件
保存并退出,然后重启mysql服务器:
systemctl restart mysqld
然后重新查询慢查询日志开关是否开启:
然后可以在相应目录下找到慢查询日志
通过cat localhost-slow.log查看是否有记录
一开始只有数据库的基本文件
查看慢查询日志尾部实时输出的内容:
tail -f localhost-slow.log
执行语句 select count(*) from tb_sku后
我们可以通过慢查询日志定位到这些执行较慢的语句进行优化!
show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:
默认profiling是关闭的,可以通过set语句在session/global级别开启profiling:
然后执行一系列的操作
select * from tb_user;
select * from tb_user where id = 1;
select * from tb_user where name = '白起';
然后通过show profiles查看这一系列操作的用时:
可以精确到每一条语句(每一个动作)
show profile for query query_id;
也可以看到每一条语句cpu的耗费情况:
show profile cpu for query query_id
explain 或者 desc命令获取MySQL如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。
select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下,id不同,值越大越先执行)。
案例1:
可以看到上图id并非自增的,都是1,而根据定义,id相同则从上往下执行
语句中的顺序为s,c,sc
explain中的顺序为s,sc,c
因为s要通过中间表sc建立关联与c产生关系
案例2:查询选修了MySQL课程的学生(子查询)
由图可知,该子查询执行顺序为c,sc,subquery2(第二个子查询,in括号里),s
表示select 的类型,常见的取值有simple(简单表,即不用表连接或者子查询)、primary(主查询,即外层的查询)、union(union中的第二个或者后面的查询语句)、subquery(select/where之后包含了子查询)等
表示连接类型,性能由好到差的连接类型为
NULL、system、const(主键或者唯一索引)、eq_ref、ref(非唯一性索引)、range、index(用了索引但仍需扫描索引)、all(全表扫描)
显示可能应用在这张表上的索引,一个或多个
实际使用的索引,如果为NULL,则没有使用索引
表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好
MySQL认为必须要执行查询的行数,在InnoDB引擎的表中,是一个估计值,可能并不总是准确的。
表示返回结果的行数占需读取行数的百分比,filtered的值越大越好