Bu mysql sorgu optimize etmek için herhangi bir şekilde?

2 Cevap php

Bu sorgu. Ben GROUP_CONCAT kullanmak şeyler kapmak için daha iyi bir yolu olup olmadığını Im çoğunlukla ilgilenen veya bu verileri kapma thats bir peri iyi bir yol olmadığını. Ben o zaman patlayacak, ve bir diziye kimlikleri / isimleri koymak, ve sonra onları dışarı yankı döngü için bir kullanın.

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

Sorgunun EXPLAIN burada

alt text

2 Cevap

Şahsen, ben birden sorguları sorgu kırmak için çalışacaktı. Çoğunlukla ben Aktör kaldırılması tavsiye ederim ve tüm bu fonksiyonların group_concat kurtulmak böylece Tür Katıldı. Sonra dışarı bu verileri çekmek için ayrı sorgu yapmak. Değil emin şeyleri hızlandırmak istiyorum, ama muhtemelen bir denemeye değer eğer.

Bu temelde genres, actors, directors, movie_ratings ve episodes arasında bir Kartezyen ürün yaptık. Eğer önceden gruplandırılmış sonuç kümesi ilgili her tablodaki eşleşen satır sayısı ürüne eşit satır bir numarası vardır, çünkü DISTINCT sizin GROUP_CONCAT() içinde kullanmak zorunda yüzden.

Bu sorgu single-value rule hakkında müsamahakar olan MySQL kullanarak konum dışında, tüm SQL işe yaramayacağını unutmayın.

Kibbee @ gibi, ben genellikle bu gibi durumlarda ayrı sorguları çalıştırmak için önerilir. Tek bir sorgu çalıştırmak için her zaman daha iyi değildir. Sorguyu kesiliyor ve emin olmak için bazı profilleme yaparak deneyin.

PS: Ne? Hayır _directors table? Yani birden fazla yönetmen ile bir hamle temsil edemez? :-)