Mysql 我可以改进我的电影选择SQL查询吗

Mysql 我可以改进我的电影选择SQL查询吗,mysql,sql,Mysql,Sql,我创建了一个数据库来存储电影数据。我的表格如下: 电影: CREATE TABLE IF NOT EXISTS `movies` ( `movieId` int(11) NOT NULL AUTO_INCREMENT, `imdbId` varchar(255) DEFAULT NULL, `imdbRating` float DEFAULT NULL, `movieTitle` varchar(255) NOT NULL, `movieLength` varchar(255

我创建了一个数据库来存储电影数据。我的表格如下:

电影:

CREATE TABLE IF NOT EXISTS `movies` (
  `movieId` int(11) NOT NULL AUTO_INCREMENT,
  `imdbId` varchar(255) DEFAULT NULL,
  `imdbRating` float DEFAULT NULL,
  `movieTitle` varchar(255) NOT NULL,
  `movieLength` varchar(255) NOT NULL,
  `imdbRatingCount` varchar(255) NOT NULL,
  `poster` varchar(255) NOT NULL,
  `year` varchar(255) NOT NULL,
  PRIMARY KEY (`movieId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
我有一个存储电影演员的表:

CREATE TABLE IF NOT EXISTS `actors` (
  `actorId` int(10) NOT NULL AUTO_INCREMENT,
  `actorName` varchar(255) NOT NULL,
  PRIMARY KEY (`actorId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
还有一个我存储电影和演员之间关系的地方:
(movieActor)

现在,当我想选择一个电影列表,其中包含选定的演员时,我的查询是:

SELECT *
FROM movies m inner join
(SELECT movieId FROM movieActor WHERE actorId IN(1,2,3) GROUP BY movieId having count(*) = 3) ma ON m.movieId = ma.movieId 
WHERE imdbRating IS NOT NULL ORDER BY imdbRating DESC

这是完美的工作,但我不知道这是实现这一点的最佳表结构和查询。是否有更好的表结构来存储数据或查询列表

首先,在表上使用索引。在我看来,对电影演员有3个索引应该是有用的。MovieId-ActorID-MovieIdActorId

第二,尝试使用外键。这些有助于确定dbs的最佳执行计划

第三,尽量避免在查询的执行计划中生成临时表。Subselect通常创建临时表,当数据库必须在RAM中临时保存某些内容时使用这些临时表。要检查这一点,请在goer查询前写下解释

我会这样写:

SELECT m.*, movieActor
FROM movies m inner join
movieActor ma ON m.movieId = ma.movieId 
WHERE imdbRating IS NOT NULL 
  and actorId IN(1,2,3)
GROUP BY movieId 
having count(*) = 3) 
ORDER BY imdbRating DESC
(未测试)


试着用EXPLAIN关键字优化它。它还可以帮助您创建正确的索引。

这个问题应该转移到,这里没有主题。
SELECT m.*, movieActor
FROM movies m inner join
movieActor ma ON m.movieId = ma.movieId 
WHERE imdbRating IS NOT NULL 
  and actorId IN(1,2,3)
GROUP BY movieId 
having count(*) = 3) 
ORDER BY imdbRating DESC