该如何优化下面的sql语句,谢谢

zhaoxiaohua125 2017-09-19 11:14:40
select a.id,a.dept_id,a.user_id,DATE_FORMAT(a.sign_time,'%Y-%m-%d %H:%i:%s') sign_time,c.department_name deptname,b.real_name from wkrj_sign_record a,wkrj_sys_user b,wkrj_sys_department c where a.dept_id=c.department_id and a.user_id=b.user_id ORDER BY sign_time DESC,c.department_order,c.department_id limit 0,20

表结构
CREATE TABLE `wkrj_sign_record` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dept_id` varchar(36) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`sign_time` datetime DEFAULT NULL,
`state` char(1) DEFAULT '0' COMMENT '0代表未签订1代表正常2代表不正常',
`ok_time` time DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `sign_time` (`sign_time`),
KEY `dept_id` (`dept_id`),
KEY `dept_id_2` (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=69261 DEFAULT CHARSET=utf8;


CREATE TABLE `wkrj_sys_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`job_id` int(11) DEFAULT NULL,
`roler_id` int(11) DEFAULT NULL,
`department_id` varchar(60) DEFAULT NULL,
`user_name` varchar(60) NOT NULL,
`password` varchar(60) DEFAULT NULL,
`real_name` varchar(30) DEFAULT NULL,
`user_is_enabled` tinyint(4) DEFAULT '1',
`sfz` varchar(20) DEFAULT NULL,
PRIMARY KEY (`user_id`),
KEY `FK_wkrj_sys_department_user` (`department_id`),
KEY `FK_wkrj_sys_roler_user` (`roler_id`),
KEY `FK_wkrj_sys_user_job` (`job_id`),
KEY `user_id` (`user_id`),
) ENGINE=InnoDB AUTO_INCREMENT=473 DEFAULT CHARSET=utf8;


CREATE TABLE `wkrj_sys_department` (
`department_id` varchar(60) NOT NULL,
`department_name` varchar(60) NOT NULL,
`parent_department_id` varchar(60) DEFAULT NULL,
`department_is_leaf` tinyint(1) DEFAULT '0',
`remark` varchar(100) DEFAULT NULL,
`department_order` smallint(10) DEFAULT NULL,
PRIMARY KEY (`department_id`),
KEY `department_order` (`department_order`),
KEY `department_id` (`department_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
...全文
329 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaoxiaohua125 2017-09-20
  • 打赏
  • 举报
回复
zhaoxiaohua125 2017-09-20
  • 打赏
  • 举报
回复
引用 11 楼 ACMAIN_CHM 的回复:
[quote=引用 8 楼 ACMAIN_CHM 的回复:] [quote=引用 3 楼 ACMAIN_CHM 的回复:] 以文本方式贴出(不要贴图!) explain select ....show index from 以供分析
那就提供以上信息吧。 如果同一秒内不同部门提交的记录多,则只能看了这些信息后来分析了。[/quote] show index from[/quote] 版主提供截图可以吗?手动打上的显示不清
hongmei85 2017-09-19
  • 打赏
  • 举报
回复
试下 `wkrj_sign_record`加个KEY `user_id` (`user_id`) `wkrj_sys_department`加个KEY (`department_order`,`department_id`), DATE_FORMAT放到php里去处理
ACMAIN_CHM 2017-09-19
  • 打赏
  • 举报
回复
引用 8 楼 ACMAIN_CHM 的回复:
[quote=引用 3 楼 ACMAIN_CHM 的回复:] 以文本方式贴出(不要贴图!) explain select ....show index from 以供分析
那就提供以上信息吧。 如果同一秒内不同部门提交的记录多,则只能看了这些信息后来分析了。[/quote] show index from
zhaoxiaohua125 2017-09-19
  • 打赏
  • 举报
回复
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE a ALL dept_id,dept_id_2 69407 Using where; Using temporary; Using filesort 1 SIMPLE b eq_ref PRIMARY,user_id PRIMARY 4 db_chengtounew.a.user_id 1 1 SIMPLE c eq_ref PRIMARY,department_id PRIMARY 182 db_chengtounew.a.user_id 1 Using where
zhaoxiaohua125 2017-09-19
  • 打赏
  • 举报
回复
引用 8 楼 ACMAIN_CHM 的回复:
[quote=引用 3 楼 ACMAIN_CHM 的回复:] 以文本方式贴出(不要贴图!) explain select ....show index from 以供分析
那就提供以上信息吧。 如果同一秒内不同部门提交的记录多,则只能看了这些信息后来分析了。[/quote] 这是一个签到的功能,每天自动生成,有人签到后则进行更新。版主是要我提供刚才截图的那些内容吗?
ACMAIN_CHM 2017-09-19
  • 打赏
  • 举报
回复
引用 3 楼 ACMAIN_CHM 的回复:
文本方式贴出(不要贴图!) explain select ....show index from 以供分析
那就提供以上信息吧。 如果同一秒内不同部门提交的记录多,则只能看了这些信息后来分析了。
zhaoxiaohua125 2017-09-19
  • 打赏
  • 举报
回复
引用 6 楼 zhaoxiaohua125 的回复:
[quote=引用 3 楼 ACMAIN_CHM 的回复:]
文本方式贴出(不要贴图!)
explain select ....

show index from

以供分析


EXPLAIN select state,a.id,a.dept_id,a.user_id,DATE_FORMAT(a.sign_time,'%Y-%m-%d %H:%i:%s') sign_time,c.department_name deptname,b.real_name from wkrj_sign_record a,wkrj_sys_user b,wkrj_sys_department c where a.dept_id=c.department_id and a.user_id=b.user_id ORDER BY sign_time DESC,c.department_order,c.department_id limit 0,20

版主我想先按时间排序然后是部门排序,按照刚才您的写法,效率提高了很多,排序上时间是可以,就是部门的排序还有点问题,求指导[/quote]

zhaoxiaohua125 2017-09-19
  • 打赏
  • 举报
回复
引用 3 楼 ACMAIN_CHM 的回复:
文本方式贴出(不要贴图!) explain select ....show index from 以供分析
EXPLAIN select state,a.id,a.dept_id,a.user_id,DATE_FORMAT(a.sign_time,'%Y-%m-%d %H:%i:%s') sign_time,c.department_name deptname,b.real_name from wkrj_sign_record a,wkrj_sys_user b,wkrj_sys_department c where a.dept_id=c.department_id and a.user_id=b.user_id ORDER BY sign_time DESC,c.department_order,c.department_id limit 0,20 版主我想先按时间排序然后是部门排序,按照刚才您的写法,效率提高了很多,排序上时间是可以,就是部门的排序还有点问题,求指导
Oh_my_godness 2017-09-19
  • 打赏
  • 举报
回复
个人建议先进行分页查询在进行排序,sql中尽量不要进行运算转换什么的,会降低执行效率
ACMAIN_CHM 2017-09-19
  • 打赏
  • 举报
回复
没有详细的EXPLAN, INDEX信息的情况下,可以先改成 select * from (select id from wkrj_sign_record order by sign_time desc limit 20) t inner join wkrj_sign_record a on t.id=a.id inner join wkrj_sys_user b on a.user_id=b.user_id inner join wkrj_sys_department c on a.dept_id=c.department_id order by a.sign_time DESC,c.department_order,c.department_id
ACMAIN_CHM 2017-09-19
  • 打赏
  • 举报
回复
文本方式贴出(不要贴图!) explain select ....show index from 以供分析
zhaoxiaohua125 2017-09-19
  • 打赏
  • 举报
回复
索引我都已经加了

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧