Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса / 15 сообщений из 15, страница 1 из 1
23.06.2015, 11:03:48
    #38990426
dsl-group
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Аналогичная ситуация, этот запрос выдернут из функции:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
// *****************************************************************************
// Purpose	gets extra parametrs
// Inputs   $productID - product ID
// Remarks		
// Returns	array of value extraparametrs
//				each item of this array has next struture
//					first type "option_type" = 0
//						"name"					- parametr name
//						"option_value"			- value
//						"option_type"			- 0
//					second type "option_type" = 1
//						"name"					- parametr name
//						"option_show_times"		- how times does show in client side this
//												parametr to select
//						"variantID_default"		- variant ID by default
//						"values_to_select"		- array of variant value to select
//							each item of "values_to_select" array has next structure
//								"variantID"			- variant ID
//								"price_surplus"		- to added to price
//								"option_value"		- value
function GetExtraParametrs($productID)
{

    if (!is_array($productID)) {

        $ProductIDs = array($productID);
        $IsProducts = false;
    } elseif (count($productID)) {

        $ProductIDs = & $productID;
        $IsProducts = true;
    } else {

        return array();
    }

    $ProductsExtras = array();
    $sql = '
		SELECT povt.productID,pot.optionID,pot.name,povt.option_value,povt.option_type,povt.option_show_times, povt.variantID, povt.optionID 
		FROM ?#PRODUCT_OPTIONS_VALUES_TABLE as povt LEFT JOIN  ?#PRODUCT_OPTIONS_TABLE as pot ON pot.optionID=povt.optionID 
		WHERE povt.productID IN (?@) ORDER BY pot.sort_order, pot.name
	';
    $Result = db_phquery($sql, $ProductIDs);

    while ($_Row = db_fetch_assoc($Result)) {

        $_Row;
        $b = null;
        if (($_Row['option_type'] == 0 || $_Row['option_type'] == NULL) && strlen(trim($_Row['option_value'])) > 0) {

            $ProductsExtras[$_Row['productID']][] = array(
                'option_type' => $_Row['option_type'],
                'name' => $_Row['name'],
                'option_value' => $_Row['option_value']
            );
        } /**
         * @features "Extra options values"
         * @state begin
         */
        else if ($_Row['option_type'] == 1) {

            //fetch all option values variants
            $sql = '
				SELECT povvt.option_value, povvt.variantID, post.price_surplus
				FROM ' . PRODUCTS_OPTIONS_SET_TABLE . ' as post
				LEFT JOIN ' . PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE . ' as povvt
				ON povvt.variantID=post.variantID
				WHERE povvt.optionID=' . $_Row['optionID'] . ' AND post.productID=' . $_Row['productID'] . ' AND povvt.optionID=' . $_Row['optionID'] . '
				ORDER BY povvt.sort_order, povvt.option_value
			';
            $q2 = db_query($sql);
            $_Row['values_to_select'] = array();
            $i = 0;
            while ($_Rowue = db_fetch_assoc($q2)) {

                $_Row['values_to_select'][$i] = array();
                $_Row['values_to_select'][$i]['option_value'] = $_Rowue['option_value'];
                if ($_Rowue['price_surplus'] > 0) $_Row['values_to_select'][$i]['option_value'] .= ' (+ ' . show_price($_Rowue['price_surplus']) . ')';
                elseif ($_Rowue['price_surplus'] < 0) $_Row['values_to_select'][$i]['option_value'] .= ' (- ' . show_price(-$_Rowue['price_surplus']) . ')';

                $_Row['values_to_select'][$i]['option_valueWithOutPrice'] = $_Rowue['option_value'];
                $_Row['values_to_select'][$i]['price_surplus'] = show_priceWithOutUnit($_Rowue['price_surplus']);
                $_Row['values_to_select'][$i]['variantID'] = $_Rowue['variantID'];
                $i++;
            }
            $ProductsExtras[$_Row['productID']][] = $_Row;
        }
        /**
         * @features "Extra options values"
         * @state end
         */
    }
    if (!$IsProducts) {

        if (!count($ProductsExtras)) return array();
        else {
            return $ProductsExtras[$productID];
        }
    }
    return $ProductsExtras;
}



При частых вызовах этой функции, Shop-Script Premium просто гаснет вместе с сервером.
При 130.000 товаров и у каждого порядка 5-10 параметров.
Есть какие нибудь идеи?
...
Рейтинг: 0 / 0
23.06.2015, 11:12:01
    #38990436
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
dsl-group,

1) Показывайте сами запросы, а не код по их генерации. Для получения текста запросов, например, можете вывести их текст или сохранить в файл непосредственно перед выполнением.

2) Показывайте планы запросов.

3) Показывайте DDL всех используемых таблиц, включая их индексы.
...
Рейтинг: 0 / 0
23.06.2015, 12:10:01
    #38990523
dsl-group
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
--
-- Структура таблицы `ss_product_options`
--

CREATE TABLE IF NOT EXISTS `ss_product_options` (
  `optionID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `sort_order` int(11) DEFAULT '0',
  PRIMARY KEY (`optionID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=19 ;

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

--
-- Структура таблицы `ss_product_options_set`
--

CREATE TABLE IF NOT EXISTS `ss_product_options_set` (
  `productID` int(11) NOT NULL DEFAULT '0',
  `optionID` int(11) NOT NULL DEFAULT '0',
  `variantID` int(11) NOT NULL DEFAULT '0',
  `price_surplus` float DEFAULT '0',
  PRIMARY KEY (`productID`,`optionID`,`variantID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

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

--
-- Структура таблицы `ss_product_options_values`
--

CREATE TABLE IF NOT EXISTS `ss_product_options_values` (
  `optionID` int(11) NOT NULL DEFAULT '0',
  `productID` int(11) NOT NULL DEFAULT '0',
  `option_value` varchar(255) DEFAULT NULL,
  `option_type` tinyint(1) DEFAULT '0',
  `option_show_times` int(11) DEFAULT '1',
  `variantID` int(11) DEFAULT NULL,
  PRIMARY KEY (`optionID`,`productID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;



Сам запрос:
Код: sql
1.
2.
3.
		SELECT povt.productID,pot.optionID,pot.name,povt.option_value,povt.option_type,povt.option_show_times, povt.variantID, povt.optionID 
		FROM ss_product_options_values as povt LEFT JOIN  ss_product_options as pot ON pot.optionID=povt.optionID 
		WHERE povt.productID IN ('96953') ORDER BY pot.sort_order, pot.name
...
Рейтинг: 0 / 0
23.06.2015, 12:55:49
    #38990579
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Код: sql
1.
CREATE INDEX idx_productID ON ss_product_options_values (productID)
...
Рейтинг: 0 / 0
23.06.2015, 12:56:45
    #38990582
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
и соответственно условие отбора перенести из WHERE в ON.
...
Рейтинг: 0 / 0
23.06.2015, 13:04:18
    #38990592
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Akinaи соответственно условие отбора перенести из WHERE в ON.А смысл? Это ж внешняя таблица.
...
Рейтинг: 0 / 0
23.06.2015, 15:21:44
    #38990741
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
miksoftА смысл? Это ж внешняя таблица.Так связывание-то левое, а не внутреннее. И условие отбора - по левой таблице. Так что оно будет (или во всяком случае должно) применяться до связывания (во всяком случае до этапа добавления NULL-овых записей справа).
...
Рейтинг: 0 / 0
23.06.2015, 15:24:12
    #38990742
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
AkinaТак что оно будет (или во всяком случае должно) применяться до связывания (во всяком случае до этапа добавления NULL-овых записей справа).Должно, но это никак не зависит от местонахождения условия.
...
Рейтинг: 0 / 0
23.06.2015, 15:25:00
    #38990745
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
dsl-groupСам запрос:
Код: sql
1.
2.
3.
		SELECT povt.productID,pot.optionID,pot.name,povt.option_value,povt.option_type,povt.option_show_times, povt.variantID, povt.optionID 
		FROM ss_product_options_values as povt LEFT JOIN  ss_product_options as pot ON pot.optionID=povt.optionID 
		WHERE povt.productID IN ('96953') ORDER BY pot.sort_order, pot.name

План запроса?
...
Рейтинг: 0 / 0
23.06.2015, 15:47:39
    #38990784
dsl-group
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
miksoftdsl-groupСам запрос:
Код: sql
1.
2.
3.
		SELECT povt.productID,pot.optionID,pot.name,povt.option_value,povt.option_type,povt.option_show_times, povt.variantID, povt.optionID 
		FROM ss_product_options_values as povt LEFT JOIN  ss_product_options as pot ON pot.optionID=povt.optionID 
		WHERE povt.productID IN ('96953') ORDER BY pot.sort_order, pot.name

План запроса?

В ss_product_options хранятся атрибуты, а в ss_product_options_values их значения, в виде: http://prntscr.com/7kbx9e
собственно я так понимаю этот запрос для каждого товара достает эти атрибуты.

Проблема заключается в том, что при выводе в каталоге, эти атрибуты выводятся у 15 товаров, и судя по статистике нагрузки на сервер, все забито этими запросами. Вероятно из-за того что база ss_product_options_values разрослась до 1,276,273 записей.

Вот такую картинку мы имеем в SSH, mysql> show processlist;
http://prntscr.com/7k8yoj
...
Рейтинг: 0 / 0
23.06.2015, 15:53:45
    #38990799
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
dsl-group,

План запроса - это несколько другое :)
Его можно увидеть, если добавить слово EXPLAIN перед запросом и выполнить его.
...
Рейтинг: 0 / 0
23.06.2015, 16:35:52
    #38990854
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
dsl-group,

В таблице
ss_product_options_values

нет индекса по полю productID

Он нужен для этого запроса.

Код: sql
1.
2.
3.
		SELECT povt.productID,pot.optionID,pot.name,povt.option_value,povt.option_type,povt.option_show_times, povt.variantID, povt.optionID 
		FROM ss_product_options_values as povt LEFT JOIN  ss_product_options as pot ON pot.optionID=povt.optionID 
		WHERE povt.productID IN ('96953')
...
Рейтинг: 0 / 0
23.06.2015, 16:37:30
    #38990857
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
AkinamiksoftА смысл? Это ж внешняя таблица.Так связывание-то левое, а не внутреннее. И условие отбора - по левой таблице. Так что оно будет (или во всяком случае должно) применяться до связывания (во всяком случае до этапа добавления NULL-овых записей справа).

Ты чего-то перепутал...
...
Рейтинг: 0 / 0
23.06.2015, 16:39:47
    #38990864
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
dsl-groupПроблема заключается в том, что при выводе в каталоге, эти атрибуты выводятся у 15 товаров, и судя по статистике нагрузки на сервер, все забито этими запросами.


Понятно, ибо table scan ...
Создашь индекс -- всё это уйдёт.

dsl-group Вероятно из-за того что база ss_product_options_values разрослась до 1,276,273 записей.


Это немного, если создашь индекс.
...
Рейтинг: 0 / 0
24.06.2015, 10:54:07
    #38991396
dsl-group
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Akina
Код: sql
1.
CREATE INDEX idx_productID ON ss_product_options_values (productID)



Действительно, в индекс попало 127627 элементов, стало оперативнее.

Спасибо. Пока нагрузка спала.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]