有啥方法可以优化这个 mysql 查询?

Posted

技术标签:

【中文标题】有啥方法可以优化这个 mysql 查询?【英文标题】:Any way to optimize this mysql query?有什么方法可以优化这个 mysql 查询? 【发布时间】:2009-06-25 02:03:01 【问题描述】:

这是查询。我最感兴趣的是是否有更好的方法来获取我使用 GROUP_CONCAT 的东西,或者如果那是获取这些数据的好方法。然后我将其分解,并将 ids/names 放入一个数组中,然后使用 for 循环将它们回显出来。

SELECT 
    mov_id, 
    mov_title, 
    GROUP_CONCAT(DISTINCT categories.cat_name) as all_genres, 
    GROUP_CONCAT(DISTINCT cat_id) as all_genres_ids,  
    GROUP_CONCAT(DISTINCT case when gen_dominant = 1 then gen_catid else 0 end) as dominant_genre_ids, 
    GROUP_CONCAT(DISTINCT actors.act_name) as all_actors, 
    GROUP_CONCAT(DISTINCT actors.act_id) as all_actor_ids, 
    mov_desc, 
    mov_added, 
    mov_thumb, 
    mov_hits, 
    mov_numvotes, 
    mov_totalvote, 
    mov_imdb, 
    mov_release, 
    mov_html, 
    mov_type,
    mov_buytickets,
    ep_summary,
    ep_airdate,
    ep_id,
    ep_hits,
    ep_totalNs,
    ep_totalRs,
    mov_rating,
    mov_rating_reason,
    mrate_name,
    dir_id, 
    dir_name
FROM movies
LEFT JOIN _genres
    ON movies.mov_id = _genres.gen_movieid
LEFT JOIN categories
    ON _genres.gen_catid = categories.cat_id
LEFT JOIN _actors
    ON (movies.mov_id = _actors.ac_movid)
LEFT JOIN actors
    ON (_actors.ac_actorid = actors.act_id AND act_famous = 1)
LEFT JOIN directors
    ON movies.mov_director = directors.dir_id
LEFT JOIN movie_ratings
    ON movies.mov_rating = movie_ratings.mrate_id
LEFT JOIN episodes
    ON mov_id = ep_showid AND ep_season = 0 AND ep_num = 0
WHERE mov_id = *MOVIE_ID* AND mov_status = 1 
GROUP BY mov_id

查询的解释在这里

alt text http://www.krayvee.com/o2/explain.gif

【问题讨论】:

【参考方案1】:

就个人而言,我会尝试将查询分解为多个查询。大多数情况下,我会建议删除 Actor 和 Genre Joins,这样您就可以摆脱所有这些 group_concat 函数。然后进行单独的查询以提取此数据。不确定它是否会加快速度,但可能值得一试。

【讨论】:

【参考方案2】:

您基本上已经完成了genresactorsdirectorsmovie_ratingsepisodes 之间的笛卡尔积。这就是为什么必须在GROUP_CONCAT() 中使用DISTINCT 的原因,因为预先分组的结果集的行数等于每个相关表中匹配行数的乘积。

请注意,此查询在 SQL 中根本不起作用,除非您使用的是允许 单值规则mysql

像@Kibbee 一样,我通常建议在这种情况下运行单独的查询。运行单个查询并不总是更好。尝试分解查询并进行一些分析以确定。

PS:什么?没有_directors 表?所以你不能代表一个以上的导演的举动? :-)

【讨论】:

是的,我只是懒惰。 :P 使用 GROUP_CONCAT 有什么问题吗? 在需要的时候使用 GROUP_CONCAT 并没有什么问题,但在你的情况下,无论如何你都会爆炸列表,所以何必呢? 想我会运行 elss 查询,这很好。我想我用另外 2 个查询替换它们,看看会发生什么。

以上是关于有啥方法可以优化这个 mysql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化Sql server 大数据量时使用 like 查询的速度?或有啥别的方法实现模糊查询?

有啥办法可以优化这个 SQL 语句?

数据量太大,分页查询变慢,有啥优化查询的方法吗

mysql查询优化器应该怎么使用

怎么进行mysql数据库优化?

MySQL:优化子查询