2013-04-25 12 views
5

Io e il nostro team stiamo riscontrando uno strano problema con le query MySQL. Usiamo una dichiarazione SELECT con un COUNT e per qualche motivo è abbastanza "veloce" nel client che usiamo (SQLyog), ma è davvero lento quando usiamo PHP.Domanda lenta in PHP ma veloce nel client

Abbiamo provato a utilizzare l'antica mysql_query(), l'estensione mysqli e abbiamo anche provato a utilizzare PDO ma non tutti hanno fatto la differenza.

Su altri post qui su Stackoverflow abbiamo rilevato che potrebbe trattarsi di un problema DNS e che potrebbe essere risolto utilizzando "skip_name_resolve" nel file my.ini ma questo era già presente nella nostra configurazione.

risultati Timed:

Cliente: 2.092 sec PHP: 9,1071 sec

Questa è la query usiamo:

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" ; 

* NOTA: per questo testcase abbiamo aggiunto SQL_NO_CACHE alla query per assicurarci di recuperare sempre un nuovo set di risultati. *

Stiamo utilizzando il seguente PHP e le versioni di MySQL:

MySQL: 5.1.61 PHP: 5.3.3

Qualsiasi suggerimento per risolvere questo problema?

+0

Si prega di mostrare il codice php. –

+0

Puoi salvare la tua query in un file di testo ed eseguire il seguente codice sulla stessa macchina in cui si trova lo script PHP: 'time mysql --user = utente --password = pass file_get_contents ("query.sql"))); " e vedere se c'è qualche differenza di orario? – core1024

+0

Puoi verificare che stai utilizzando SQLyog dalla stessa macchina che ospita il tuo PHP? Se ti connetti al tuo server mySql da due host diversi, ciò potrebbe spiegare la differenza _some_. Mostraci il codice PHP? – Sepster

risposta

2

non riesco a spiegare la differenza in termini di prestazioni, ma se dovessi indovinare direi che una o alcune delle seguenti cose sono in gioco:

  • Il server sta ottimizzando la query in modo diverso a causa di le diverse connessioni client,
  • La diversa posizione dei SQLyog e PHP clienti potrebbero essere un fattore

Come ho detto, solo supposizioni.

Ma a prescindere, ho tentato di riordinare la query come segue. Mi chiedo se questo potrebbe funzionare meglio (e in modo più coerente)?

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

Grazie per il tuo commento! La query è ora veloce, ma restituisce risultati diversi/errati rispetto alla query originale. –

+0

penso che, dovrebbe essere INNER JOIN db.media_tag_multimedia e LEFT join media.media_tag b –

+0

@JesperVeldhuizen Ci scusiamo per questo. Query corretta (spero!). Fammi sapere se questo funziona OK ora. – Sepster

Problemi correlati