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
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
per la versione myisam cambiate l'engine in myisam ed il nome in test_myisam.

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!