0

对我来说,它的特定查询一直在慢查询日志中弹出。有什么办法可以提高效率吗?

SELECT 
    mov_id, 
    mov_title, 
    GROUP_CONCAT(DISTINCT genres.genre_name) as all_genres, 
    mov_desc, 
    mov_added, 
    mov_thumb, 
    mov_hits, 
    mov_numvotes, 
    mov_totalvote, 
    mov_imdb, 
    mov_release, 
    mov_type 
FROM movies 
LEFT JOIN _genres 
    ON movies.mov_id = _genres.gen_movieid
LEFT JOIN genres
    ON _genres.gen_catid = genres.grenre_id 
WHERE mov_status = 1 AND mov_incomplete = 0 AND mov_type = 1 
GROUP BY mov_id 
ORDER BY mov_added DESC 
LIMIT 0, 20;

我主要关心的是 group_concat 函数,它输出一个逗号分隔的与特定电影相关的流派列表,我将其放入 for 循环并制作可点击的链接。

替代文字

4

3 回答 3

1

你需要流派名称吗?如果您可以只使用genre_id,则可以消除第二个连接。(您可以稍后在 UI 中使用缓存填写流派名称)。

你有什么索引?

你可能想要

create index idx_movies on movies 
  (mov_added, mov_type, mov_status, mov_incomplete)

最肯定的是连接索引

create index ind_genres_movies on _genres
  (gen_mov_id, gen_cat_id)
于 2009-07-23T05:22:15.087 回答
0

您可以发布 EXPLAIN 的输出吗?即将 EXPLAIN 放在 SELECT 前面并发布结果。

使用 SELECT STRAIGHT JOIN 并根据表格的大小对表格进行排序,我已经取得了很多胜利。

STRAIGHT JOIN 停止 mysql 猜测连接表的顺序并按照指定的顺序执行,因此如果您首先使用最小的表,您可以减少被连接的行数。

我假设你有关于 mov_id、gen_movieid、gen_catid 和 grenre_id 的索引?

于 2009-07-23T05:22:20.623 回答
0

“使用临时,使用文件排序”来自组 concat distinctgenres.genre_name。

试图在没有索引的列上获得不同的值将导致使用临时表。尝试在genre_name 列上添加索引。

于 2009-08-09T23:42:38.357 回答