Avatar billede w13 Novice
13. april 2016 - 12:22 Der er 6 kommentarer og
1 løsning

Optimere MySQL-streng

Hej Eksperter

Jeg har den her motherfucker af en databasestreng, som i min konkurrence er begyndt at loade meget langsomt, da der er kommet rigtig mange deltagere, og hver deltager uploader et billede, som der kan stemmes på. Så min database skal både holde styr på deltagere, deres billeder, stemmer på de forskellige billeder, OG om den nuværende IP har stemt på et givent billede.

Derfor ville jeg høre, om nogen af jer kunne hjælpe mig med at skære ned på MySQL-strengen, så databasekaldet ikke var så tungt.

---

SELECT
            cp.id,
            cp.name,
            i.image_url,
            i.image_thumbnail_url,
            cp.instagram_link,
            cp.is_from_instagram,
            COUNT(cpv.id)  AS votes,
            COUNT(cpvy.id) AS your_votes,
            cp.time_created
        FROM
            competition_photos AS cp
        LEFT JOIN (
            SELECT
                id,
                image_url,
                image_thumbnail_url
            FROM
                images
        ) AS i
        ON
            cp.image_id = i.id
        LEFT JOIN (
            SELECT
                id,
                competition_photo_id
            FROM
                competition_photo_votes
        ) AS cpv
        ON
            cp.id = cpv.competition_photo_id
        LEFT JOIN (
            SELECT
                id,
                competition_photo_id
            FROM
                competition_photo_votes
            WHERE
                ip = "' . $user_ip . '"
        ) AS cpvy
        ON
            cp.id = cpvy.competition_photo_id
        WHERE
            cp.is_hidden = 0
        GROUP BY
            cp.id
        ORDER BY
          votes DESC
        LIMIT
          1, 60

---

Jeg tænker fx at man måske ikke behøver 1 left join for først at hente samlede antal stemmer for et givent billede, og derefter endnu 1 left join for at finde ud af, om brugerens IP har stemt på det givne billede.

Jeg håber, nogle af jer har bud på, hvad jeg kan gøre anderledes.

Med venlig hilsen
Tobias
Avatar billede arne_v Ekspert
13. april 2016 - 14:13 #1
Er der index paa alt det som der skal vaere index paa?
Avatar billede w13 Novice
13. april 2016 - 14:28 #2
Arne_v: Nej, det er jeg en hat til. Er det simpelt nok?
Avatar billede arne_v Ekspert
13. april 2016 - 14:35 #3
index er saa vigtig for performance !
Avatar billede Rune1983 Ekspert
13. april 2016 - 14:36 #4
Ligner en streng som kunne være et generel kald ret ofte. Kunne et VIEW af det kald ikke være en mulighed og kald så det VIEW fremover?
Avatar billede arne_v Ekspert
13. april 2016 - 14:37 #5
Proev og saet index paa:
* alle felter som indgaar i ON medmindre de er primaernoegle (saa har de allerede implicit index)
* alle felter som indgaar i WHERE medmindre de er primaernoegle (saa har de allerede implicit index)
* alle felter bruges i ORDER BY
* alle felter som indgaar i GROUP BY
Avatar billede arne_v Ekspert
13. april 2016 - 14:38 #6
hvis du er hard core saa spoerg MySQL hvad dere langsomt !!

http://dev.mysql.com/doc/refman/5.7/en/explain-output.html
Avatar billede w13 Novice
13. maj 2016 - 13:09 #7
Jeg har ikke fundet en løsning, men lukker her. Smid et par svar! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester