【Python】如何提高这个 sql 语句的查询效率

【Python】如何提高这个 sql 语句的查询效率

数据是 MySQL 的实例数据库,这是数据库的地址,有心帮忙的朋友可以直接在数据库上进行测试。

host:125.42.176.217:63306

user:ousikongjian

password: [email protected]#

database: employees

需求

查询 1999 年时期,部门、主管及部门员工的详细信息,需 Department, DeptManager, Employees, Title, DeptEmp 五个表联合查询,其中对 Employees, Title 两个表进行了两次查询,多次查询的时候注意设置别名。

结果是: 返回字段为     dp.dept_no(部门编号), dept_name(部门名称), dm_emp_no(主管编号),

dm_title(主管头衔), dm_birth_date(主管生日),dm_first_name(主管第一名称),

dm_last_name(主管姓氏), dm_gender(主管性别), dm_hire_date(主管聘任日期),

dm_from_date(主管任期开始时间), dm_to_date(主管任期结束时间),emp_no(员工编号),title(员工头衔),

t_from_date(头衔授予时间), t_to_date(头衔结束时间),birth_date(员工生日),

first_name(员工第一名称), last_name(员工姓氏), gender(员工性别), hire_date(员工聘任日期),

from_date(员工在本部门任期开始时间), to_date(员工在本部门任期结束时间)

自己写的 SQL 语句如下

SELECT

d.dept_no,

d.dept_name,

em.emp_no AS dm_emp_no,

t1.title AS dm_title,

em.birth_date AS dm_birth_date,

em.first_name AS dm_first_name,

em.last_name AS dm_last_name,

em.gender AS dm_gender,

em.hire_date AS dm_hire_date,

dm.from_date AS dm_from_date,

dm.to_date AS dm_to_date,

e.emp_no,

t2.title,

t2.from_date AS t_from_date,

t2.to_date AS t_to_date,

e.birth_date,

e.first_name,

e.last_name,

e.gender,

e.hire_date,

de.from_date,

de.to_date

FROM

employees e

JOIN dept_emp de ON de.emp_no = e.emp_no

JOIN departments d ON d.dept_no = de.dept_no

JOIN dept_manager dm ON dm.dept_no = d.dept_no

JOIN employees em ON dm.emp_no = em.emp_no

JOIN titles t1 ON t1.emp_no = em.emp_no

AND t1.from_date = dm.from_date # 这里取了巧,认为部门负责人在负责该部门的头衔时间和任期是一致的。

AND t1.to_date = dm.to_date

JOIN titles t2 ON t2.emp_no = e.emp_no

WHERE

(

'1999' BETWEEN YEAR (de.from_date)

AND YEAR (de.to_date)

)

AND (

'1999' BETWEEN YEAR (dm.from_date)

AND YEAR (dm.to_date)

)

AND (

'1999' BETWEEN YEAR (t2.from_date)

AND YEAR (t2.to_date)

)

GROUP BY

e.emp_no,

d.dept_no,

d.dept_name,

em.emp_no,

t1.title,

em.birth_date,

em.first_name,

em.last_name,

em.gender,

em.hire_date,

dm.from_date,

dm.to_date,

t2.title,

t2.from_date,

t2.to_date,

e.birth_date,

e.first_name,

e.last_name,

e.gender,

e.hire_date,

de.from_date,

de.to_date

查询的结果是 281354 条数据,查询时间为 33.709 秒。

问题

希望大家帮忙,通过优化 SQL 语句提高查询效率。

sql to sqlalchemy 项目送上真挚的问候,希望您能够喜欢!!!

回答

把group by全去了,我这边100条0.195s, 带着group by 100条8.12s(group by会引发Using filesort)

字段有点多,后面有时候慢慢看看。
不过,你 SQL 中那么多 group by ,确定没问题。
还有就是,员工的部门,薪酬,都存在历史时期的数据,不同时期的这类数据在使用时,要么看确定的某一个员工的多时期情况,要看确定时期的多员工情况,但是,并没有看到有类似的过滤条件。换句话说,多时期,多员工的数据出来,基本不会直接做什么用的,还要再处理。

除了楼上朋友提的group by的建议外,我建议把where那一块也给优化下。
因为你查出来的数据较多,有28W条以上,所以应该还是有必要把索引也用上的。
优化方式:
1.为where中的相关字段添加索引,如字段dm.from_date
2.不要对这些字段使用YEAR等方法,这样会导致索引失效。
例如'1999' BETWEEN YEAR (de.from_date) AND YEAR (de.to_date)修改为
de.from_date < '1999' and de.to_date > '1999'
(因为没太明白你要查的数据的需求,所以可能写的和你想要的不太一样,但是大致意思就这个样子。)

不建议关联这么多张表,只查询最基本的信息,其他如部门,主管,头衔,做出key=>value的样子,通过编程语言的foreach添加进去。

另外groupby的时候,【select from (select from t1 group by ) left join t2. 】先分组缩小join的数据。
多写几种sql,比较下执行时间,从中选择最高效的一种。

以上是 【Python】如何提高这个 sql 语句的查询效率 的全部内容, 来源链接: utcz.com/a/80789.html

回到顶部