第8章 执行计划获取和分析
1.命令介绍
分析你的SQL查询语句走不走索引
2.使用方法
desc select * from city where countrycode='CHN';
explain select * from city where countrycode='CHN';
3.执行计划字段解释
table :此次查询访问的表
type :索引查询的类型(ALL、index、range、ref、eq_ref、const(system)、NULL)
possible_keys :可能会应用的索引
key : 最终选择的索引
key_len :索引覆盖长度,主要是用来判断联合索引应用长度。
rows :需要扫描的行数
Extra :额外信息
4.索引类型
ALL 没有使用到索引
index 全索引扫描
range 索引范围扫描
ref 辅助索引等值查询
eq_ref 多表连接查询中,非驱动表的连接条件是主键或唯一键时
const(system) 主键或唯一键等值查询
NULL 没查到数据
第9章 key_len
1.key_len介绍
简单来讲,key_len就是查看你的联合索引的匹配度
2.key_len计算
key_len=a+b+c
列的key_len长度,按照每列的最大预留长度来做的计算。
create table t1 (
id int,
a int ,
b char(10),
c varchar(10));
最大存储预留长度(字节):
-------------------------------------------------------------------------------
数据类型 : 占用字节量 不能为空 允许空
-------------------------------------------------------------------------------
数字类型:
tinyint : 1字节 1 1+1
int : 4字节 4 4+1
bigint : 8字节 8 8+1
-------------------------------------------------------------------------------
字符串类型:
utf8:
char(10) : 10*3字节 =30 30 30+1
varchar(10) : 10*3+2字节=32 32 32+1
-------------------------------------------------------------------------------
utf8mb4:
char(10) :10*4字节 =40 40 40+1
varchar(10) :10*4字节+2 =42 42 42+1
-------------------------------------------------------------------------------
use test;
create table test (
id int not null primary key auto_increment,
a int not null , # 4
b int , # 5
c char(10) not null , # 40
d varchar(10), # 43
e varchar(10) not null # 42
)engine=innodb charset=utf8mb4;
alter table test add index idx(a,b,c,d,e);
5个列覆盖:
4+5+40+43+42=134
4个列覆盖:
4+5+40+43=92
3个列覆盖:
4+5+40=49
2个列覆盖:
4+5=9
应用1个列:
4
3.key_len注意
查询语句必须包含联合索引的最左列,这样联合索引才能被匹配
如果是多个列的联合索引,查询条件必须从左到右依次匹配上才行,否则从哪里断掉,后面的列都不匹配了
创建联合索引需要注意的是,将重复值最少的列为最左列
二进制 1111 1111 位 b
字节 1B 字节 = 8b 8位
千字节 1K 字节 = 1024B
兆字节 1M 字节 = 1024K
吉字节 1G 字节 = 1024M
太字节 1T 字节 = 1024G
1P = 1024T
1E = 1024P
第10章 建立索引的原则
1.必须要有主键,如果没有可以做为主键条件的列,创建无关列
2.经常做为where条件列 order by group by join on, distinct 的条件(业务:产品功能+用户行为)
3.最好使用唯一值多的列作为索引,如果索引列重复值较多,可以考虑使用联合索引
4.列值长度较长的索引列,我们建议使用前缀索引.
5.降低索引条目,一方面不要创建没用索引,不常使用的索引清理,percona toolkit(xxxxx)
6.索引维护要避开业务繁忙期,建议用pt-osc
第11章 不走索引的情况
没有查询条件或者查询条件没有建立索引
查询结果集是原表中的大部分数据
隐式转换导致索引失效
<>,not in 不走索引
like "%_" 百分号在最前面不走
第1章 错误日志
1.默认位置
如果没有指定日志路径,默认mysql的日志存储在数据目录下: 主机名.err
2.指定位置
vim /etc/my.cnf
log_error=/data/mysql_3306/logs/mysql.err
3.通过命令查看日志路径
select @@log_error;
select @@datadir;
4.注意
如果你自定义了日志路径,那么在启动之前需要提前确保日志文件存在并且mysql有写入权限
如果自定义了日志,在使用mysqld前台启动的时候,就不打印在屏幕上了,而是自定义的日志文件里
第2章 慢日志
1.慢日志作用
记录执行速度较慢的SQL语句
2.修改配置
vim /etc/my.cnf
slow_query_log=1 #是否启用慢查询日志,1为启用,0为禁用
slow_query_log_file=/data/mysql_3306/logs/slow.log #慢日志路径
long_query_time=0.1 #SQL语句运行时间阈值,执行时间大于参数值的语句才会被记录下来
log_queries_not_using_indexes=1 #将没有使用索引的语句记录到慢查询日志
3.模拟慢语句
select sleep(1) from sc;
select * from sc;
select * from t100w where k1 like 'abc%';
select * from t100w where id > '1';