项目亮点之慢SQL
慢SQL
慢SQL优化
发现慢SQL
show processlist
查询当前慢sql的语句
优化慢SQL
步骤
explain sql语句
的方式查看慢sql的执行计划- 分析该SQL语句索引使用情况,全表扫描情况
常见信息
列名 | 含义 |
---|---|
id | 选择标识符 |
select_type | 表示查询的类型 |
table | 输出结果集的表 |
partitions | 匹配的分区 |
type | 表示表的连接类型 |
possible_keys | 表示查询时,可能使用的索引 |
key | 表示实际使用的索引 |
key_len | 索引字段的长度 |
ref | 列与索引的比较 |
rows | 扫描出的行数(估算的行数) |
filtered | 按表条件过滤的行百分比 |
Extra | 执行情况的描述和说明 |
多表查询示例
- 首先确保第一行是我们定义的表,就是按照我们定义的join顺序执行,如果不是的话最好前面表的查询字段变成主键或者唯一索引
- 然后确保每行都尽量用索引,每行基本都是一个a=b对比条件,这个时候首先看a和b的类型是否一致,比如integer=string,肯定没法比,然后类型一致后增加索引就可以了
SELECT
a.id,
a.parent_id AS "parent.id",
a.parent_ids,
a.area_id AS "area.id",
a.CODE,
a.NAME,
a.sort,
a.type,
a.grade,
a.address,
a.zip_code,
a.MASTER,
a.phone,
a.fax,
a.email,
a.remarks,
a.create_by AS "createBy.id",
a.create_date,
a.update_by AS "updateBy.id",
a.update_date,
a.del_flag,
a.useable AS useable,
a.primary_person AS "primaryPerson.id",
a.deputy_person AS "deputyPerson.id",
p.NAME AS "parent.name",
ar.NAME AS "area.name",
ar.parent_ids AS "area.parentIds",
pp.NAME AS "primaryPerson.name",
pp.login_name AS "primaryPerson.loginName",
dp.NAME AS "deputyPerson.name",
a.art_category AS "artCategory",
a.introduction,
a.telephone,
a.photo
FROM
sys_office a
LEFT JOIN sys_office p ON p.id = a.parent_id
LEFT JOIN sys_area ar ON ar.id = a.area_id
LEFT JOIN sys_user pp ON pp.id = a.primary_person
LEFT JOIN sys_user dp ON dp.id = a.deputy_person
WHERE
a.del_flag = 0;
查看执行计划
a表优化
无优化
p表优化
p ON p.id = a.parent_id
,类型一致为varchar,加索引
- ALTER TABLE sys_office ADD index
id_index
(id
); - ALTER TABLE sys_office ADD index
parent_id_index
(parent_id
);
ar表优化
无优化
pp表优化
sys_user pp ON pp.id = a.primary_person
,类型一致为varchar,加索引
- ALTER TABLE sys_user ADD INDEX
id_index
(id
);
dp表优化
dp.id = a.deputy_person
,已经优化
查看执行计划
SQL规范
- insert
- 主键id有顺序
- delete
- 逻辑删除
- update
- 用主键关系非索引字段
- select
- 违背最左前缀原则
- select *
- 索引列上有计算
- 索引列使用函数
- 索引字段类型不同
- like左边包含%
- or关键字未全部使用索引
- not in和not exists
- 多表关联最多2张
- 使用left join或right join代替not in和exist
- 不使用外键和触发器