加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL索引原理及慢查询优化

发布时间:2016-09-27 18:25:29 所属栏目:MySql教程 来源:站长网
导读:副标题#e# MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓好马配好鞍,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如精通MySQL、SQL语句优化

简述一下执行计划,首先mysql根据idx_last_upd_date索引扫描cm_log表获得379条记录;然后查表扫描了63727条记录,分为两部分,derived表示构造表,也就是不存在的表,可以简单理解成是一个语句形成的结果集,后面的数字表示语句的ID。derived2表示的是ID = 2的查询构造了虚拟表,并且返回了63727条记录。我们再来看看ID = 2的语句究竟做了写什么返回了这么大量的数据,首先全表扫描employee表13317条记录,然后根据索引emp_certificate_empid关联emp_certificate表,rows = 1表示,每个关联都只锁定了一条记录,效率比较高。获得后,再和cm_log的379条记录根据规则关联。从执行过程上可以看出返回了太多的数据,返回的数据绝大部分cm_log都用不到,因为cm_log只锁定了379条记录。

如何优化呢?可以看到我们在运行完后还是要和cm_log做join,那么我们能不能之前和cm_log做join呢?仔细分析语句不难发现,其基本思想是如果cm_log的ref_table是EmpCertificate就关联emp_certificate表,如果ref_table是Employee就关联employee表,我们完全可以拆成两部分,并用union连接起来,注意这里用union,而不用union all是因为原语句有“distinct”来得到唯一的记录,而union恰好具备了这种功能。如果原语句中没有distinct不需要去重,我们就可以直接使用union all了,因为使用union需要去重的动作,会影响SQL性能。

优化过的语句如下

select

emp.id

from

cm_log cl

inner join

employee emp

on cl.ref_table = 'Employee'

and cl.ref_oid = emp.id

where

cl.last_upd_date >='2013-11-07 15:03:00'

and cl.last_upd_date<='2013-11-08 16:00:00'

and emp.is_deleted = 0

union

select

emp.id

from

cm_log cl

inner join

emp_certificate ec

on cl.ref_table = 'EmpCertificate'

and cl.ref_oid = ec.id

inner join

employee emp

on emp.id = ec.emp_id

where

cl.last_upd_date >='2013-11-07 15:03:00'

and cl.last_upd_date<='2013-11-08 16:00:00'

and emp.is_deleted = 0

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读