Sql 如何减少以下查询的墙时间?

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

(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 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()。