2015-02-07 2 views
-4

У меня есть скрипт php, который создает файл csv.php script вызывает 100% -ный процессор mysql

Когда я запускаю сервер, он всегда использует 100% -ный процессор, и я не могу получить доступ к веб-сайту в течение 4/5 минут.

Как я могу ограничить использование процессора для этого скрипта?

В сценарии есть mysql SELECT с примерно 30000 результирующей строкой и некоторыми strip_tags.

Спасибо заранее

Небольшая часть кода:

 $listing_sql = " 
    SELECT 
    p.products_id, 
    p.products_image, 
    p.manufacturers_id, 
p.products_details_original_supplier_code, 
p.products_details_original_prod_code, 
    p.products_weight, 
    p.products_tax_class_id AS tax_id, 
p.products_quantity_local AS availability, 
    pd.products_name, 
    g.customers_group_price, 
    pd.products_description, 
    p2c.categories_id, 
    c.parent_id, 
    c.categories_id, 
    cd.categories_name, 
    m.manufacturers_id, 
    g.customers_group_price, 
    g.products_id, 
    IF(p.manufacturers_id = 0, NULL, m.manufacturers_name) AS marca, 
    IF(s.status, s.specials_new_products_price, NULL) AS specials_new_products_price, 
    IF(s.status, s.specials_new_products_price, g.customers_group_price) AS final_price, 
    IF(p.products_model = NULL, -1, p.products_model) as codprod 
    FROM 
    ".TABLE_PRODUCTS." p 
    LEFT JOIN ".TABLE_SPECIALS." s ON p.products_id = s.products_id 
    LEFT JOIN ".TABLE_MANUFACTURERS." m ON p.manufacturers_id = m.manufacturers_id 
    LEFT JOIN ".TABLE_PRODUCTS_GROUPS." g ON p.products_id = g.products_id AND g.customers_group_id = 3, 
    ".TABLE_PRODUCTS_DESCRIPTION." pd, 
    ".TABLE_PRODUCTS_TO_CATEGORIES." p2c, 
    ".TABLE_CATEGORIES." c, 
    ".TABLE_CATEGORIES_DESCRIPTION." cd 

    WHERE 
    p2c.categories_id = c.categories_id AND 
    c.categories_id = cd.categories_id AND 
    p.products_id = p2c.products_id AND 
    pd.products_id = p2c.products_id AND 
    pd.language_id = '$language_id' AND 
    cd.language_id = '$language_id' 
    ORDER BY final_price DESC 
    "; 

...

$filestring.=$row["products_id"]."|".$row["products_name"]."|".$site_url."/images/".$row["products_image"]."|".$site_url."/product_info.php?products_id=".$row["products_id"]."|".$cat_list."|".$final_price."|".$descrizione1."|".$row["marca"]."|" . $row["availability"] ."|" . $shippingprice2 ."|" . $row["codprod"]."|".$row["products_details_original_supplier_code"]."|".$row["products_details_original_prod_code"]."<endrecord>\r\n"; 


    $rescount += 1;// $rescount++; 
    } 
//  echo $filestring; 

$filename = $file."name_file"; 
file_put_contents("./files/$filename.csv", "$filestring"); 
exit; 

.

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 

-- 
-- Database: `namedb` 
-- 

-- -------------------------------------------------------- 

-- 
-- Struttura della tabella `oscpro_categories` 
-- 

CREATE TABLE IF NOT EXISTS `oscpro_categories` (
    `on_header` int(1) default '0', 
    `categories_id` int(11) NOT NULL auto_increment, 
    `categories_image` varchar(255) default NULL, 
    `parent_id` int(11) NOT NULL default '0', 
    `sort_order` int(3) default NULL, 
    `date_added` datetime default NULL, 
    `last_modified` datetime default NULL, 
    `categories_import_module_codes` varchar(255) default NULL, 
    `categories_status` tinyint(1) unsigned NOT NULL default '1', 
    `categories_allowed_customers_gid` int(11) default '0', 
    `categories_image_top` varchar(255) default NULL, 
    `categories_oscproie_module_code` varchar(255) default 'OSCPROIE', 
    PRIMARY KEY (`categories_id`), 
    KEY `idx_categories_parent_id` (`parent_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1748 ; 

-- -------------------------------------------------------- 

-- 
-- Struttura della tabella `oscpro_categories_description` 
-- 

CREATE TABLE IF NOT EXISTS `oscpro_categories_description` (
    `categories_id` int(11) NOT NULL default '0', 
    `language_id` int(11) NOT NULL default '1', 
    `categories_name` varchar(255) default NULL, 
    `categories_description` text, 
    `categories_pages_descriptionmetatag` text, 
    `categories_pages_keywordsmetatag` varchar(255) default NULL, 
    `categories_pages_titletag` varchar(255) default NULL, 
    `categories_image_alttag` varchar(255) default NULL, 
    `categories_pages_htmlseocode` text, 
    PRIMARY KEY (`categories_id`,`language_id`), 
    KEY `idx_categories_name` (`categories_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

-- -------------------------------------------------------- 

-- 
-- Struttura della tabella `oscpro_manufacturers` 
-- 

CREATE TABLE IF NOT EXISTS `oscpro_manufacturers` (
    `manufacturers_id` int(11) NOT NULL auto_increment, 
    `manufacturers_name` varchar(32) default NULL, 
    `manufacturers_image` varchar(64) default NULL, 
    `date_added` datetime default NULL, 
    `last_modified` datetime default NULL, 
    `manufacturers_import_module_codes` varchar(255) default NULL, 
    `manufacturers_oscproie_module_code` varchar(255) default 'OSCPROIE', 
    PRIMARY KEY (`manufacturers_id`), 
    KEY `IDX_MANUFACTURERS_NAME` (`manufacturers_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=610 ; 

-- -------------------------------------------------------- 

-- 
-- Struttura della tabella `oscpro_products` 
-- 

CREATE TABLE IF NOT EXISTS `oscpro_products` (
    `products_id` int(11) NOT NULL auto_increment, 
    `products_quantity` int(11) NOT NULL default '0', 
    `products_details_original_supplier_code` varchar(64) default NULL, 
    `products_image_hot_linking_big` varchar(255) default NULL, 
    `products_image_hot_linking_medium` varchar(255) default NULL, 
    `products_image_hot_linking_small` varchar(255) default NULL, 
    `products_image` varchar(255) default NULL, 
    `products_image_extra1` varchar(255) default NULL, 
    `products_image_extra2` varchar(255) default NULL, 
    `products_image_extra3` varchar(255) default NULL, 
    `products_image_extra4` varchar(255) default NULL, 
    `products_image_extra5` varchar(255) default NULL, 
    `products_image_extra6` varchar(255) default NULL, 
    `products_price` decimal(15,4) NOT NULL default '0.0000', 
    `products_date_added` datetime default NULL, 
    `products_last_modified` datetime default NULL, 
    `products_date_available` datetime default NULL, 
    `products_weight` decimal(15,3) NOT NULL default '0.000', 
    `products_status` tinyint(1) NOT NULL default '0', 
    `products_carrot` tinyint(1) default '0', 
    `products_tax_class_id` int(11) NOT NULL default '0', 
    `manufacturers_id` int(11) NOT NULL default '0', 
    `products_ordered` int(11) NOT NULL default '0', 
    `products_percentage` tinyint(1) NOT NULL default '1', 
    `products_details_original_prod_code` varchar(64) default NULL, 
    `products_model` varchar(64) default NULL, 
    `products_details_pages_numbers` int(12) default '0', 
    `products_details_isbn` varchar(255) default NULL, 
    `products_details_upc` varchar(10) default NULL, 
    `products_details_release_date` datetime default NULL, 
    `products_details_run_time` int(12) default NULL, 
    `products_import_module_codes` varchar(255) default NULL, 
    `products_details_outside_code` varchar(255) default NULL, 
    `products_image_hot_linking` tinyint(1) default NULL, 
    `products_to_rss` tinyint(4) NOT NULL default '1', 
    `products_master` int(11) NOT NULL default '0', 
    `products_master_status` tinyint(2) NOT NULL default '-1', 
    `products_master_type` tinyint(1) NOT NULL default '1', 
    `products_listing_status` tinyint(2) NOT NULL default '1', 
    `products_master_temp` varchar(255) default NULL, 
    `products_ship_price` varchar(255) default NULL, 
    `products_ship_flag` tinyint(1) default '0', 
    `products_quantity_local` int(11) default '0', 
    `products_quantity_remote` int(11) default '0', 
    `products_details_oscproie_code` varchar(255) default NULL, 
    `products_oscproie_module_code` varchar(255) default 'OSCPROIE', 
    `products_bundle` enum('no','yes') NOT NULL default 'no', 
    `sold_in_bundle_only` enum('no','yes') NOT NULL default 'no', 
    `icecatcode` varchar(64) NOT NULL default '', 
    `eancode` varchar(13) NOT NULL default '', 
    PRIMARY KEY (`products_id`), 
    KEY `idx_products_date_added` (`products_date_added`), 
    KEY `idx_products_model` (`products_details_original_supplier_code`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=39294 ; 

-- -------------------------------------------------------- 

-- 
-- Struttura della tabella `oscpro_products_description` 
-- 

CREATE TABLE IF NOT EXISTS `oscpro_products_description` (
    `products_id` int(11) NOT NULL auto_increment, 
    `language_id` int(11) NOT NULL default '1', 
    `products_name` varchar(255) NOT NULL, 
    `products_description` text, 
    `products_url` varchar(255) default NULL, 
    `products_url_title` varchar(255) default NULL, 
    `products_url_extra1` varchar(255) default NULL, 
    `products_url_extra1_title` varchar(255) default NULL, 
    `products_url_extra2` varchar(255) default NULL, 
    `products_url_extra2_title` varchar(255) default NULL, 
    `products_url_extra3` varchar(255) default NULL, 
    `products_url_extra3_title` varchar(255) default NULL, 
    `products_url_extra4` varchar(255) default NULL, 
    `products_url_extra4_title` varchar(255) default NULL, 
    `products_viewed` int(5) default '0', 
    `products_details_author` varchar(255) default NULL, 
    `products_details_label` varchar(255) default NULL, 
    `products_details_distributedby` varchar(255) default NULL, 
    `products_details_levels` varchar(255) default NULL, 
    `products_details_language` varchar(255) default NULL, 
    `products_details_format` varchar(255) default NULL, 
    `main_image_alt_tag` varchar(255) default NULL, 
    `products_details_generic3` varchar(255) default NULL, 
    `products_details_titletag` varchar(255) default NULL, 
    `products_details_keywordsmetatag` varchar(255) default NULL, 
    `products_details_descriptionmetatag` text, 
    `products_details_hot_linking` varchar(255) default NULL, 
    PRIMARY KEY (`products_id`,`language_id`), 
    KEY `products_name` (`products_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=39294 ; 

-- -------------------------------------------------------- 

-- 
-- Struttura della tabella `oscpro_products_groups` 
-- 

CREATE TABLE IF NOT EXISTS `oscpro_products_groups` (
    `customers_group_id` int(11) NOT NULL default '0', 
    `customers_group_price` decimal(15,4) NOT NULL default '0.0000', 
    `products_id` int(11) NOT NULL default '0', 
    `products_price` decimal(10,0) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

-- -------------------------------------------------------- 

-- 
-- Struttura della tabella `oscpro_products_to_categories` 
-- 

CREATE TABLE IF NOT EXISTS `oscpro_products_to_categories` (
    `products_id` int(11) NOT NULL default '0', 
    `categories_id` int(11) NOT NULL default '0', 
    PRIMARY KEY (`products_id`,`categories_id`), 
    KEY `ptc_catidx` (`categories_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

-- -------------------------------------------------------- 

-- 
-- Struttura della tabella `oscpro_specials` 
-- 

CREATE TABLE IF NOT EXISTS `oscpro_specials` (
    `specials_id` int(11) NOT NULL auto_increment, 
    `products_id` int(11) NOT NULL default '0', 
    `specials_new_products_price` decimal(15,4) NOT NULL default '0.0000', 
    `specials_date_added` datetime default NULL, 
    `specials_last_modified` datetime default NULL, 
    `expires_date` datetime default NULL, 
    `date_status_change` datetime default NULL, 
    `status` int(1) NOT NULL default '1', 
    `customers_group_id` int(11) NOT NULL default '0', 
    PRIMARY KEY (`specials_id`), 
    KEY `idx_specials_products_id` (`products_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=303 ; 

/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 
+1

Если вы запускаете запрос самостоятельно, не создавая файл CSV, вы все равно достигаете 100% использования ЦП? –

+0

Пожалуйста, дайте нам дополнительную ясность – sailesh

+0

Покажите нам свой скрипт –

ответ

1

Некоторые первоначальные мысли по оптимизации:

p2c.categories_id = c.categories_id AND 
c.categories_id = cd.categories_id AND 
p.products_id = p2c.products_id AND 
pd.products_id = p2c.products_id 

Эти выглядит как они старый стиль соединяет. Поскольку они полностью объединены, я бы начал с переключения их на INNER JOIN типов. Я не знаю, принесет ли он производительность, но он сообщает базе данных, что это объединение, а не общее сравнение равенства, и, таким образом, он может сделать «на лету» оптимизацию.

AND 
pd.language_id = '$language_id' AND 
cd.language_id = '$language_id' 

У вас нет указателей на эти столбцы, поэтому начните с них и снова оцените эффективность запроса.

Затем проверьте свои столбцы соединения и попробуйте добавить к ним индексы. Держите точный журнал о том, какие индексы вы добавляете: не просто создайте индекс на все, так как это может повредить производительность INSERT в другом месте. Я бы добавил индекс, измерил изменение производительности, удалю его, добавлю другое, измерим изменение производительности, а затем, возможно, попробуем два вместе и т. Д.

Не забудьте посмотреть your explain plan, чтобы узнать, где узкое место.

Ваша версия MySQL также очень старая, можете ли вы ее обновить?


Кроме того, рассмотрите проблему по-другому. Как я упоминал в комментариях, Apache блокируется, пока этот длительный процесс запущен; я предполагаю, что это причина того, что сайт не работает в то же время и не связан с загрузкой процессора вообще. Сайт может работать медленнее для других пользователей, но не должен полностью блокироваться.

Таким образом, настройте cron для запуска этого запроса и сохраните результаты вне вашего веб-процесса, и ваш сайт должен оставаться работоспособным во время его работы. Попробуйте - достаточно легко настроить!


Третья вещь, чтобы попробовать: Ваши таблицы MyISAM, которые я считаю, блокировка на уровне таблицы, а не на уровне строк. Таким образом, скопируйте свои данные на тестовый компьютер и настройте свой сайт и убедитесь, что, пока ваш скрипт работает в этой неживой среде, он недоступен. Затем, convert your tables to InnoDB, и проверьте, не исчезла ли проблема.InnoDB блокируется на уровне строк и поэтому может разрешать доступ, даже если другие строки заняты вашим долговременным запросом.

Другим способом подтверждения этого может быть создание тривиального PHP-скрипта и таблицы MySQL, так что сценарий читает/записывает в таблицу. Он должен по-прежнему работать, когда ваш длинный скрипт активен, и если это произойдет, он покажет, что MySQL по-прежнему отвечает на запросы в порядке, но что любые запросы , связанные с заблокированными таблицами, должны будут ждать.

+0

Я пробовал INNER JOIN, не пользуясь преимуществами. Я хочу использовать SELECT EXPLAIN, но я не знаю, как это сделать. Я могу попытаться обновить mysql, но я боюсь ошибок. Невозможно просто установить для этого скрипта максимум 30% ресурса cpu/mysql? – Fabio

+0

Благодарю вас за всех, но у меня все еще есть этот скрипт, выполняемый на cronjob, как мне это нужно, каждые 3 часа, но проблема такая же. – Fabio

+0

@Fabio: чтобы быть понятным, вы перенесли этот длинный запрос из веб-процесса на скрипт cron, и вы обнаружите, что ваш веб-процесс по-прежнему не реагирует на время запроса, время для которого пять минут? – halfer

Смежные вопросы