有什么方法可以改善这种慢查询吗?

时间:2009-07-23 05:15:03

标签: mysql query-optimization

它的特定查询一直在慢速查询日志中弹出。有什么方法可以提高效率吗?

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循环和点击链接。

alt text

3 个答案:

答案 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列上添加索引。