它的特定查询一直在慢速查询日志中弹出。有什么方法可以提高效率吗?
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循环和点击链接。
答案 0 :(得分: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)
答案 1 :(得分:0)
你可以发布EXPLAIN的输出吗?即将EXPLAIN放在SELECT前面并发布结果。
使用SELECT STRAIGHT JOIN并根据尺寸排序表,我获得了不少胜利。
STRAIGHT JOIN停止mysql猜测连接表的顺序是什么,并按照指定的顺序执行,因此如果您首先使用最小的表,则可以减少要连接的行数。
我假设你有关于mov_id,gen_movieid,gen_catid和grenre_id的索引?
答案 2 :(得分:0)
'using temporary,using filesort'来自group concat distinct genres.genre_name。
尝试在没有索引的列上获得不同内容将导致使用临时表。 尝试在genre_name列上添加索引。