Magento Groups http://www.magentocommerce.com/group/view/187 Оптимизация SQL запросов en Magento Community Copyright 2008 2008-08-29T19:52:55-8:00 SELECT count(distinct ... http://www.magentocommerce.com/group/blog/action/viewpost/248/group/187/

... TODO: Надо будет просканировать.

]]>
2008-02-06T18:27:37-8:00
Indexed columns must be NOT NULL http://www.magentocommerce.com/group/blog/action/viewpost/246/group/187/

При использовании JOIN в таблицах где количество рядов более чем 1000, с NULL колоннами могут возникнуть трудности по использованию индексов.
Число 1000 это какое то магическое число после которого ДБ начинает во всю использовать индексы.
Например SKU инициализированна как NULL. Понятно что за этим следует объяснение: так сделано для Duplicate продукта. После Duplicate он естественно пуст.
Предлагаю заполнить ну вот так например: “-- FIX MY SKU --” . uniqid ($id); после того как SKU в таблице будет NOT NULL

p.s. Сам не тестировал. Ну нет у меня столько данных. Я бы с удовольствием протестировал с 1000000 данными. Так что приходится искать в слепую.

]]>
2008-02-04T22:14:57-8:00
Скорость почти выросла на пол минуты! http://www.magentocommerce.com/group/blog/action/viewpost/243/group/187/

В общем всё дело, оказывается, в /app/code/core/Mage/Core/functions.php функция __autoload().

info: Она (__autoload) служит для автоматической загрузки файла класса которую использует PHP5 если определение класса не найденна перед его использованием.

Как видно в оригинальной functions.php параметр функции парсится на кусочки, строится относительны путь файла и вводится в include()
После этого PHP5 с ‘бешеной’ скоростью начинает рыть файловую систему для поиска файла, путь которого задан относительно. Это стоит ему много труда и времени, да и общее время суммируется для всех файлов. Задав абсолютный путь, работа для него намного упрощается.
Приблизительно вот так:

function __autoload($class)
{
    
if (strpos($class'/')!==false{
        
return;
    
}
    $classFile 
uc_words($classDS).'.php';
    
$a explode('_'$class);
    
Varien_Profiler::start('AUTOLOAD');
    
Varien_Profiler::start('AUTOLOAD: '.$a[0]);

    
$firstWay $a[0];
    
$cPrefix '';
    
    switch (
$firstWay){
        
case 'Zend':
        case 
'Varien':
            
$cPrefix '/web/projects/magento_dev/lib/';
        break;
        
        case 
'Mage':
            
$cPrefix '/web/projects/magento_dev/app/code/core/';
        break;
        
    
}
    
include ($cPrefix $classFile);
    
    
Varien_Profiler::stop('AUTOLOAD');
    
Varien_Profiler::stop('AUTOLOAD: '.$a[0]);
}
Конечно же, можно использовать некоторые параметры коренных путей из конфигурации и т.д. но здесь показана лишь суть решения выше сказанной проблемы.
Пользователям Windows для тестировки лучше использовать двойную обратную косую черту для разделителей папок в место обычной косой (/) так как и здесь съедается некоторое количество времени.

для проверки чистого времени рендеринга можно использовать в index.php временно следующее:

function getmicrotime() 
    
list($usec$sec) = explode(" ",microtime()); 
    return ((float)
$usec + (float)$sec); 
}
$time_start 
getmicrotime();

require_once 
'app/Mage.php';
umask(0);
Mage::run('base');

$time_end getmicrotime();
$time $time_end $time_start;
echo 
"Rendered in $time seconds";
p.s. Данный профайлинг времени нужно убрать если используете ajax так как он не сработает с мешающими ему символами.

В Linux временной выигрыш чуть меньше из-за лучшего I/O показателя для файлов, чем в Windows.

]]>
2008-02-01T00:56:26-8:00