MySQL学习目录
 
 
索引的分类
主键索引,唯一索引,常规索引,全文索引
0
 
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种
聚集索引,二级索引
0
自己理解:通常聚集索引为主键索引,如果创建表的时候没有设置主键索引,那么MySQL会在列中找到一个没有重复数据的列来充当聚集索引,如果在列中没有合适的列的话,那么MySQL会自动维护一列,来充当聚集索引。
所有的二级索引,定位到的都是聚集索引值,然后再通过聚集索引获取到对应的数据。
聚集索引的选取规则(比较官方的说法):
1.如果存在主键,主键索引就是聚集索引;
2.如果不存在主键,将私用第一个唯一(UNIQUE)索引作为聚集索引。
3.如果没有主键,也没有合适的唯一索引,则InnoDB会自动生成并维护一个rowid作为隐藏的聚集索引。
0
从结构上来说,聚集索引叶子节点中挂载的是对应的行数据;二级索引叶子节点挂在的是聚集索引值,一般就是主键值。
例子说明:
SELECT * FROM user WHERE name='Arm';
1.首先name字段是有设置二级索引的,那么首先从二级索引的最顶端节点开始匹配,匹配到的是id为10;
2.其次,根据查询到的主键id为10的值,去聚集索引中查询查询到对应行的数据,这个过程称之为回表查询。
 
SQL性能分析
1.SQL执行频率
MySQL客户端连接成功后,通过show[session|global] status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT,UPDATE,DELETE,SELECT的访问频次;
SHOW GLOBAL STATUS LIKE 'Com_______'; 七个下划线
0
2.慢查询日志
慢查询日志记录了所有执行时间超过指定参数(log_query_time,单位:秒,默认10秒)的所有SQL语句的日志。
查看慢查询日志是否开启:show variables like 'slow_query_log'; on代表开启OFF代表未开启
MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
#开启MySQL慢日志查询开关
slow_query_log=1
#设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
log_query_time=2
配置完毕之后,通过以下执行重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息 /var/lib/mysql/localhost-show.log
3.profile详情
show profiles能够在做SQL优化时帮助我们了解事件都耗费到哪里去了。
通过have_profiling参数,能够看到当前MySQL是否支持profile操作:select @@have_profiling;
默认profiling是关闭的,可以通过set语句在session/global级别开启profiling:set profiling=1;
执行若干select命令之后,用:show profiles;命令来查看语句耗时情况
#查看每一个sql的耗时基本情况
show profiles;
#查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;
#查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_Id;
4.explain执行计划
explain 或者desc命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接顺序。
#直接在select语句之前加上关键字explain/desc
explain select 语句;
0
explain 执行计划个字段含义:
1.id
select 查询的序列号,表示查询中select字句或者操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)
2.select_type
表示select的类型,常见的取值有simple(简单表,即不适用表连接或者子查询)、PRIMARY(主查询,即外层查询)、UNION(UNION中的第二个或者后边的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等
3.type (优化时的重点指标)
表示连接类型,性能由好到差的连接类型为NULL,system,const,eq_ref,ref,range,index,all。优化时要求最差满足ref。
不查询表时,是null。
0
访问系统表时,是system。
主键访问/唯一索引访问时,是const。
使用非唯一索引时,是ref。
4.possible_keys (优化时的重点指标)
表示可能用到的索引
5.key (优化时的重点指标)
表示实际使用的索引,如果为null,则没有使用索引。
6.key_len 表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。
7.rows (优化时的重点指标)
表示MySQL认为必须要执行查询的行数,在InnoDB引擎的表中,是一个预估值,可能并不总是准确的。
8.filterd 表示返回结果的行数占需读取行数的百分比,filtered的值越大越好。
9.extra 表示额外信息。
 
posted on 2022-06-25 10:25  CRUDEngineer  阅读(32)  评论(0编辑  收藏  举报