Mysql 需要时间加载的查询结果

Mysql 需要时间加载的查询结果,mysql,performance,left-join,Mysql,Performance,Left Join,我有一个从六个表中提取数据的查询,但是提取数据花费了太多的时间。浏览器有时会加载并显示结果为空。当我在MySQL数据库中运行此查询时,执行此查询需要很长时间 SELECT SQL_CALC_FOUND_ROWS movies.*, curriculums.name AS curriculum, teachers.name AS teacher, movie_sub_categories.name AS sub_cat_name, movie_categories.name AS cat_name

我有一个从六个表中提取数据的查询,但是提取数据花费了太多的时间。浏览器有时会加载并显示结果为空。当我在MySQL数据库中运行此查询时,执行此查询需要很长时间

SELECT SQL_CALC_FOUND_ROWS movies.*,
curriculums.name AS curriculum,
teachers.name AS teacher,
movie_sub_categories.name AS sub_cat_name,
movie_categories.name AS cat_name
FROM movies
LEFT JOIN curriculums on movies.curriculum_id = curriculums.id
LEFT JOIN teachers on movies.teacher_id = teachers.id
LEFT JOIN movies_movie_sub_categories on movies.id = movies_movie_sub_categories.movie_id
LEFT JOIN movie_sub_categories on movies_movie_sub_categories.movie_sub_category_id = movie_sub_categories.id
LEFT JOIN movie_categories on movie_sub_categories.movie_category_id = movie_categories.id
ORDER BY id LIMIT 0, 50
这里是我所有的桌子结构

表movies\u movie\u sub\u categories需要有一个关于movie\u id的索引和一个关于movie\u sub\u category\u id的单独索引。如果没有这两个索引,查询生成器将被迫扫描每条记录两次(因为查询有两个引用该表的单独join子句)

这不是一个非常令人兴奋的查询——它只提供
id
所属表的前50行。当
加入时
,请对列进行限定,以便我们知道发生了什么

您真的需要离开

假设您需要
LEFT
并且
id
属于
movies
,那么这应该运行得更快:

同时,只需一次查找电影中的行数,这样就不必每次都计算

SELECT  movies.*, curriculums.name AS curriculum,
        teachers.name AS teacher, movie_sub_categories.name AS sub_cat_name,
        movie_categories.name AS cat_name
    FROM  ( SELECT id FROM movies ORDER BY id LIMIT 0, 50 ) AS m
    JOIN  movies USING(id)
    LEFT JOIN  curriculums AS c  ON movies.curriculum_id = c.id
    LEFT JOIN  teachers AS t  ON movies.teacher_id = t.id
    LEFT JOIN  movies_movie_sub_categories AS mmsc  ON movies.id = mmsc.movie_id
    LEFT JOIN  movie_sub_categories AS msc  ON mmsc.movie_sub_category_id = msc.id
    LEFT JOIN  movie_categories AS mc  ON msc.movie_category_id = mc.id
    ORDER BY  m.id 
请使用
显示创建表
;我们需要看看您是否有足够的索引,例如

mmsc:  INDEX(movie_id)

为所有涉及的表提供带有
SHOW CREATE table table
的表结构,并提供
EXPLAIN query
。。如果没有这些信息,我们将无法帮助您。请检查表中的索引。所有列都应编入索引,以便在上的联接查询中使用clause@RaymondNijland我已将我的桌面方案的屏幕截图放在地图上。仅为方便补充文本和/或为文本中无法给出的内容使用图像。使用编辑函数内联,而不是链接,如果你有代表-使你的文章自我包含。不要给出没有图例/键的图表。如果您想了解有关性能编码的知识,请阅读MySQL手册“重新索引和优化”中的所有内容。这里有很多通用资源。谢谢你的回答,我会核对一下。