o5 / grido

Grido - DataGrid for Nette Framework
http://o5.github.io/grido-examples/
MIT License
90 stars 88 forks source link

NetteDatabase::getCount() #5

Closed jeancz closed 11 years ago

jeancz commented 11 years ago

Při zjišťování počtu záznamů, si zbytečně grida nechává vracet všechny záznamy, díky špatnému volání getCount() ve tříde NetteDatabase.php.

Správně by mělo být:

/**
 * @return int
 */
public function getCount()
{
    return $this->selection->count('*');
}
o5 commented 11 years ago

Vrátil jsem to zpátky. Vyjmenované sloupce jsou samozřejmě lepší/rychlejší než *.

jeancz commented 11 years ago

Problém je, ale v něčem jiném. Když se volá $this->selection->count(); bez parametrů, tak se v libs\nette\nette\Nette\Database\Table\Selection.php provede tento kód:

    /**
     * Counts number of rows.
     * @param  string  if it is not provided returns count of result rows, otherwise runs new sql counting query
     * @return int
     */
    public function count($column = NULL)
    {
        if (!$column) {
            $this->execute();
            return count($this->data);
        }
        return $this->aggregation("COUNT($column)");
    }

a jak můžeš vidět, tak se count zjiští tím nejméně efektivním způsobem. Vrátí se všechny řádky do pole a nad nimi se v php použije funkce count().

Proto je fajn tam dát buď sloupec s primárním klíčem nebo indexem a nebo prostě '*' a mysql to vyhodnotí samo.