项目亮点之慢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;

查看执行计划

image-20220723145621729

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,已经优化

查看执行计划

image-20220723151139818

SQL规范

  • insert
    • 主键id有顺序
  • delete
    • 逻辑删除
  • update
    • 用主键关系非索引字段
  • select
    • 违背最左前缀原则
    • select *
    • 索引列上有计算
    • 索引列使用函数
    • 索引字段类型不同
    • like左边包含%
    • or关键字未全部使用索引
    • not in和not exists
  • 多表关联最多2张
  • 使用left join或right join代替not in和exist
  • 不使用外键和触发器
posted @ 2022-07-26 22:19  Faetbwac  阅读(35)  评论(0编辑  收藏  举报