Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [MySQL] Confronto performance SQL_CALC_FOUND_ROWS e COUNT

    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!
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  2. #2
    apache 2.2.21
    php 5.3.10
    mysql 5.5.22 (32 bit)

    windows 7 64bit AMD Athlon II X2 240

    http://www.webalice.it/apmacca/pirla...ndrows.php.htm

    un solo commento. count() legge l'indice e potrebbe manco scorrere tutti i record l'altro deve sempre scorrere tutta la tabella per contare il result set.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    si, infatti ho fatto i test con e senza indice proprio per questo motivo

    ma praticamente la differenza tra le due è minima senza indice, ma quando c'è l'indice è abissale ... e considerando che ovviamente gli indici sono un must ... direi che passerò ad usare COUNT mi sa

    comunque sto notando che da te, sulle myisam il count rende peggio (anche se si parla di variazioni insignificanti in realtà) ... ma in generale sulle stringhe rende peggio (=> LIKE) probabilmente perché li gli indici li può usare poco e/o male e deve fare comunque un full table scan

    comunque, ho deciso ... ora converto tutto il mio cms per fargli usare select count + select dati
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  4. #4
    qui hai anche una prova con windows xp pro

    intel core2 duo cpu e6550
    mysql 5.5.23
    php 5.3.8

    http://www.webalice.it/apmacca/pirla...ws-wxp.php.htm

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.