mysql 优化实战
来源:互联网 发布:软件行业的进项 编辑:程序博客网 时间:2024/06/05 05:18
1.优化前sql
EXPLAIN
SELECT DISTINCT
t.user_id,
t.work_date,
t.should_start_time,
t.start_time,
checkin_status,
t.should_end_time,
t.end_time,
t.checkout_status,
acomment,
dept.dept_name,
`user`.user_name,
raw.record_address
FROM
`hr_work` t
LEFT JOIN user_user `user` ON `user`.user_id = t.user_id
LEFT JOIN hr_dept dept ON dept.hr_dept_id = `user`.dept_id
LEFT JOIN (
SELECT
CONVERT (MIN(record_time), CHAR) startDate,
CONVERT (Max(record_time), CHAR) endDate,
date_format(record_time, '%Y%m%d') work_date,
record_latitude,
record_longitude,
record_address,
user_id
FROM
hr_work_rawdata
WHERE
1 = 1
GROUP BY
LEFT (record_time, 10)
ORDER BY
record_time ASC
) raw ON raw.work_date = t.work_date
WHERE
`user`.active_flag = 1
AND t.user_id = '8QI3'
AND (
t.work_date >= '20170701'
AND t.work_date <= '20170726'
)
ORDER BY
t.work_date ASC
SELECT DISTINCT
t.user_id,
t.work_date,
t.should_start_time,
t.start_time,
checkin_status,
t.should_end_time,
t.end_time,
t.checkout_status,
acomment,
dept.dept_name,
`user`.user_name,
raw.record_address
FROM
`hr_work` t
LEFT JOIN user_user `user` ON `user`.user_id = t.user_id
LEFT JOIN hr_dept dept ON dept.hr_dept_id = `user`.dept_id
LEFT JOIN (
SELECT
CONVERT (MIN(record_time), CHAR) startDate,
CONVERT (Max(record_time), CHAR) endDate,
date_format(record_time, '%Y%m%d') work_date,
record_latitude,
record_longitude,
record_address,
user_id
FROM
hr_work_rawdata
WHERE
1 = 1
GROUP BY
LEFT (record_time, 10)
ORDER BY
record_time ASC
) raw ON raw.work_date = t.work_date
WHERE
`user`.active_flag = 1
AND t.user_id = '8QI3'
AND (
t.work_date >= '20170701'
AND t.work_date <= '20170726'
)
ORDER BY
t.work_date ASC
2.优化以后
explain SELECTt.user_id,
t.work_date,
t.should_start_time,
t.start_time,
checkin_status,
t.should_end_time,
t.end_time,
t.checkout_status
acomment,
dept.dept_name,
`user`.user_name,
raw.record_address
FROM
`hr_work` t
STRAIGHT_JOIN user_user `user` ON `user`.user_id = t.user_id
LEFT JOIN hr_dept dept ON dept.hr_dept_id = `user`.dept_id
left join (
SELECT
CONVERT (MIN(record_time), CHAR) startDate,
CONVERT (Max(record_time), CHAR) endDate,
create_time,
record_address
FROM
hr_work_rawdata force index(groupbytime)
WHERE
hr_work_rawdata.create_time>= '20170701'
AND hr_work_rawdata.create_time <= '20170726'
group by hr_work_rawdata.create_time
) raw ON raw.create_time = t.work_date
WHERE `user`.active_flag = 1
AND
t.user_id = '8QI3'
AND (
t.work_date >= '20170701'
AND t.work_date <= '20170726'
)
group by t.user_id,t.work_date order by t.work_date
优化思考:
1.没有确定驱动表,首先用STRAIGHT_JOIN 确定驱动表
2.关于全表扫描,建立组合索引,workdateuser(user_id,work_date),groupbytime(create_time,user_id)
这两部是扫描行数降低
3.distinct,临时表,排序问题,使用group by 代替distinct。distinct真正的使用场景不是去除重复,而是去重重复统计,包括group by 如何使用
https://yq.aliyun.com/ziliao/69592这篇文章介绍的不错
阅读全文
0 0
- mysql 优化实战
- MySQL性能优化实战
- MySQL优化实战
- mysql优化实战
- MySQL性能优化实战
- MySQL性能优化实战
- mysql 优化实战
- 一次MySQL查询优化实战
- MySQL性能优化二十大实战经验
- MySQL性能优化二十大实战经验
- MySQL性能优化二十大实战经验
- mysql优化实战(explain && 索引)
- MySQL性能优化二十大实战经验
- MySql优化实战,详解存储过程
- mysql性能优化学习与实战-1
- mysql性能优化学习与实战-2
- MySQL 索引原理概述及慢查询优化实战
- 【小镇的技术天梯】小镇的实战!mysql性能优化。
- Mac系统eclipse(4.7)安装JAD插件
- 欢迎使用CSDN-markdown编辑器
- JQuery的父、子、兄弟节点查找方法
- 关于用IDEA的两个坑。赶快写下来跟遇到类似问题的同学提供点帮助
- Java数组-二分查找原理
- mysql 优化实战
- linux 内核信号量 用户态信号量 详解
- utf-8 去掉中文标点符号
- 滑块运动 — 到目标位置宽度缓慢展开
- 并发编程实战死锁读书笔记之吐槽
- 【学习笔记】天嵌2440第三季下学期——linux tcp网络编程
- Linux中三种网络模式是什么意思——bridged(一桥接模式)
- echarts 地图区域无法显示
- CSS visibility占位隐藏属性