2013-04-25 3 views
5

Ich und unser Team haben ein seltsames Problem mit MySQL-Abfragen. Wir verwenden eine SELECT Anweisung mit einer COUNT und aus irgendeinem Grund ist es ziemlich "schnell" in dem Client, den wir verwenden (SQLyog), aber es ist wirklich langsam, wenn wir PHP verwenden.Abfrage langsam in PHP aber schnell in Client

Wir haben versucht, die alte mysql_query(), die mysqli-Erweiterung zu verwenden, und wir haben auch versucht, PDO zu verwenden, aber alle machten keinen Unterschied.

Auf anderen Posts hier auf Stackoverflow fanden wir, dass es ein DNS-Problem sein könnte, und dass es mit 'Skip_name_resolve' in der my.ini behoben werden konnte, aber wir hatten dies bereits in unserer Konfiguration.

Timed Ergebnisse:

Kunde: 2,092 sec PHP: 9,1071 sec

Dies ist die Abfrage, die wir verwenden:

SELECT SQL_NO_CACHE 
    COUNT(m.mm_id) AS total 
FROM 
    db.media_multimedia m 
WHERE m.cat_id IN 
    (SELECT 
    mc.cat_id 
    FROM 
    db.media_multimedia_category mc 
    WHERE mc.cat_active = 1) 
    AND m.mm_published = 1 
    AND (
    m.mm_title LIKE "%denniy%" 
    OR m.mm_text LIKE "%denniy%" 
    OR m.mm_id IN 
    (SELECT 
     a.mm_id 
    FROM 
     db.`media_tag_multimedia` a 
     LEFT JOIN media.`media_tag` b 
     ON a.`tag_id` = b.tag_id 
    WHERE b.tag_name LIKE "%denniy%") 
) 
    AND m.mm_publishing_date >= "2012-04-24 00:00:00" 
    AND m.mm_publishing_date <= "2013-04-24 23:59:59" ; 

* HINWEIS: für diesen Testfall fügten wir SQL_NO_CACHE zur Abfrage, um sicherzustellen, dass immer eine neue Ergebnismenge abgerufen wird. *

Wir sind mit dem folgenden PHP und MYSQL Versionen:

MySQL: 5.1.61 PHP: 5.3.3

Irgendwelche Vorschläge, dieses Problem zu beheben?

+0

Bitte zeigen Sie Ihren PHP-Code. –

+0

Können Sie Ihre Abfrage in einer Textdatei speichern und den folgenden Code auf demselben Computer ausführen, auf dem sich Ihr PHP-Skript befindet: 'time mysql --user = user --password = übergeben Sie file_get_contents ("query.sql"))); '' und sehen, ob es einen Zeitunterschied gibt? – core1024

+0

Können Sie überprüfen, ob Sie SQLyog von demselben Computer aus ausführen, auf dem Ihr PHP gehostet wird? Wenn Sie von zwei verschiedenen Hosts eine Verbindung zu Ihrem mySql-Server herstellen, könnte dies einen Unterschied erklären. Zeigen Sie uns den PHP-Code? – Sepster

Antwort

2

ich den Unterschied in der Leistung nicht erklären kann, obwohl, wenn ich mich raten müsste eine oder einige der folgenden Dinge sagen würde, sind im Spiel:

  • Der Server Abfrage anders optimiert wegen die verschiedenen Client-Verbindungen,
  • der andere Ort Ihrer SQLyog und PHP Kunden könnten einen Faktor

sein Wie ich schon sagte, nur Vermutungen.

Aber egal, ich habe versucht, Ihre Abfrage wie folgt aufzuräumen. Ich frage mich, ob dies besser (und konsequenter) sein könnte?

SELECT SQL_NO_CACHE 
    COUNT(m.mm_id) AS total 

FROM 
    db.media_multimedia m 

    INNER JOIN db.media_multimedia_category mc 
    ON m.cat_id = mc.cat_id 
    AND mc.cat_active = 1 

    LEFT JOIN db.media_tag_multimedia a 
    ON m.mm_id = a.mm_id 

    INNER JOIN media.media_tag b 
    ON a.tag_id = b.tag_id 

WHERE 
    m.mm_published = 1 
    AND 
    (
    m.mm_title LIKE "%denniy%" 
    OR 
    m.mm_text LIKE "%denniy%" 
    OR 
    b.tag_name LIKE "%denniy%" 
) 
    AND m.mm_publishing_date >= "2012-04-24 00:00:00" 
    AND m.mm_publishing_date <= "2013-04-24 23:59:59" ; 
+0

Danke für Ihren Kommentar! Die Abfrage ist jetzt schnell, gibt jedoch andere/falsche Ergebnisse als die ursprüngliche Abfrage zurück. –

+0

ich denke, dass es INNER JOIN sein sollte db.media_tag_multimedia, und LINKS beitreten media.media_tag b –

+0

@JesperVeldhuizen Sorry darüber. Abfrage korrigiert (ich hoffe!). Lassen Sie mich wissen, ob das jetzt in Ordnung ist. – Sepster

Verwandte Themen