索引分类:
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
聚集索引:将数据存储与索引放到了一块,索引结构的叶子节点,保存了行数据。聚集索引必须有,而且只有一个。
二级索引: 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键。二级索引可以存在多个。
聚集索引选取规则:
--如果存在主键,主键索引就是聚集索引
--如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
--如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为聚集索引
回表查询:先通过二级索引找到对应主键,再通过聚集索引找到对应行数据。
索引语法:
为某个或多个字段创建索引,不加前缀则为常规索引。只关联一个字段的索引为单列索引,关联多个字段的索引为联合索引或组合索引。
性能分析:
SQL执行频率:
global查看全局的状态信息,session统计当前会话的状态信息。
代码演示:
执行两次select后(一次成功,一次代码错误)
Com_select的value指增加了2,说明错误的代码执行也会增加次数 。
慢查询日志:
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。
MySQL的慢查询日志默认没有开启,可以通过 如下指令来查看开启状态:
show variables like 'slow_query_log';
若要开启,需在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
#慢查询日志
slow_query_log=1
也可以更改超时时间:
#超时时间
long_query_time=2
保存后再次查询慢查询日志开启状态:
日志文件保存在:/var/lib.mysql/localhost-slow.log
profile:
show profiles 能够在作SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:
select @@have_profiling;
默认profiling是关闭的,可通过select @@profiling查看profiling开启状况:
可以通过set语句在session/global级别开启profiling:
set profiling=1;
再次查看profiling:
此时为开启状态
查看每一条SQL语句耗时基本情况:
查看指定id指令的各阶段耗时及cpu使用情况:
explain执行计划:
EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。
语法:直接在select语句之前加上关键字explain/desc。
explain select ... from ... where ...;
desc select ... from ... where ...;
EXPLAIN执行计划各字段含义
以上内容均学自b站黑马MySQL课程