Hola a todos,
come da titolo ho effettuato un raffronto, a livello di performance, tra SQL_CALC_FOUND_ROWS e COUNT e la cosa mi ha sorpreso non poco.
Premesso che ho sempre ritenuto che SQL_CALC_FOUND_ROWS fosse SEMPRE più veloce perché, a livello logico, esegue una sola query rispetto alla coppia SELECT + SELECT COUNT e soprattutto esegue una query che, tecnicamente, dovrebbe essere ottimizzata per effettuare anche il conteggio totale dei records.
La cosa che mi ha sconfortato, non poco, è stata che non solo SQL_CALC_FOUND_ROWS è più lento, ma lo è anche di parecchio in certi casi!
I test sono stati effettuati su due macchine differenti, la mia postazione di sviluppo più un server che utilizzo online, una macchina discretamente potente.
La mia postazione di sviluppo monta Windows 7 mentre la macchina online un linux a 64bit.
MySQL, su entrabi, è la versione 5.1 (5.1.53 sulla mia postazione di sviluppo, mentre online è la 5.1.41).
Ovviamente i test sono stati eseguiti disabilitando la CACHE, era importante capire quale dei due era più performante. Con la cache attiva SQL_CALC_FOUND_ROWS rende molto meglio su MyISAM, su InnoDB continua ad andare più lento rispetto al count.
La tabella che ho utilizzato per i test è la seguente
per la versione myisam cambiate l'engine in myisam ed il nome in test_myisam.codice:CREATE TABLE `test_innodb` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `a` INT(10) NOT NULL, `a_index` INT(10) NOT NULL, `b` VARCHAR(50) NOT NULL, `b_index` VARCHAR(50) NOT NULL, `c` DECIMAL(11,10) NOT NULL, `c_index` DECIMAL(11,10) NOT NULL, PRIMARY KEY (`id`), INDEX `a_index` (`a_index`), INDEX `b_index` (`b_index`), INDEX `c_index` (`c_index`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB
I Risultati del test sono in formato HTML con le differenze colorate, per rendere subito "visibile" la differenza, e sono disponibili qui
http://www.itechcon.it/private/sql_c...test_hw_1.html
http://www.itechcon.it/private/sql_c...test_hw_2.html
Mentre a quest'indirizzo è disponibile l'archivio con i file php usati per i test, ovviamente dovete impostare i parametri per la connessione
http://www.itechcon.it/private/sql_c...count/test.zip
Qualcuno potrebbe effettuare qualche raffronto ulteriore per confermare/smentire le differenze? Ma soprattutto potrebbe eseguirli su una versione più recente di MySQL?
Danke!

Rispondi quotando