Sql 如何减少以下查询的墙时间?
(125,3) 墙壁时间:18分钟18秒Sql 如何减少以下查询的墙时间?,sql,sqlite,time-complexity,Sql,Sqlite,Time Complexity,(125,3) 墙壁时间:18分钟18秒 SELECT Movie.year AS Year, COUNT(*) AS NOM ,Movie.Title FROM MOVIE JOIN M_Cast ON TRIM(M_Cast.mid) = TRIM(Movie.mid) JOIN Person ON TRIM(Person.pid) = TRIM(M_Cast.pid) WHERE Person.Gender = 'Female' GROUP BY
SELECT Movie.year AS Year, COUNT(*) AS NOM ,Movie.Title
FROM MOVIE JOIN M_Cast ON TRIM(M_Cast.mid) = TRIM(Movie.mid) JOIN
Person ON TRIM(Person.pid) = TRIM(M_Cast.pid)
WHERE Person.Gender = 'Female'
GROUP BY Movie.year
ORDER BY NOM DESC
每年,统计当年只有女性演员的电影数量你使用trim()
阻止了索引的使用。对于表之间的连接,您永远不应该需要这个。因此:
SELECT m.year AS Year, COUNT(*) AS NOM , m.Title
FROM MOVIE m JOIN
M_Cast c
ON c.mid = m.mid JOIN
Person p
ON p.pid = c.pid
WHERE p.Gender = 'Female'
GROUP BY m.year
ORDER BY NOM DESC ;
在结构正确的数据库中,MOVIE
和PERSON
中的ID应该是主键。如果他们没有,你应该解决这个问题
您还需要mu CAST(mid,pid)
或mu CAST(pid,mid)
上的索引
如果主键是字符串,则应修复该值,以便永远不需要TRIM()
:
update movie
set mid = trim(mid);
请添加SQL的文本,而不是图片,以便我们可以调试或调整它。首先,那些
TRIM()
阻止使用典型索引。在小数据集上,这不会引起注意,但在大数据集上,这会降低性能。是否需要TRIM()
功能?你可以移除它们吗?不使用Trimm,这个查询给出了所有这些ID需要修剪的空白声明,并使用UPDATE语句进行处理。这样,查询中就不需要trim()。