【Python】如何提高这个 sql 语句的查询效率
数据是 MySQL 的实例数据库,这是数据库的地址,有心帮忙的朋友可以直接在数据库上进行测试。
host:125.42.176.217:63306user: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 语句如下
SELECTd.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