powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса
15 сообщений из 15, страница 1 из 1
Оптимизация SQL запроса
    #38990426
dsl-group
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аналогичная ситуация, этот запрос выдернут из функции:

Код: 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
Оптимизация SQL запроса
    #38990436
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dsl-group,

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

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

3) Показывайте DDL всех используемых таблиц, включая их индексы.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38990523
dsl-group
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Оптимизация SQL запроса
    #38990579
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
CREATE INDEX idx_productID ON ss_product_options_values (productID)
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38990582
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и соответственно условие отбора перенести из WHERE в ON.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38990592
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaи соответственно условие отбора перенести из WHERE в ON.А смысл? Это ж внешняя таблица.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38990741
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftА смысл? Это ж внешняя таблица.Так связывание-то левое, а не внутреннее. И условие отбора - по левой таблице. Так что оно будет (или во всяком случае должно) применяться до связывания (во всяком случае до этапа добавления NULL-овых записей справа).
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38990742
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaТак что оно будет (или во всяком случае должно) применяться до связывания (во всяком случае до этапа добавления NULL-овых записей справа).Должно, но это никак не зависит от местонахождения условия.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38990745
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оптимизация SQL запроса
    #38990784
dsl-group
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Оптимизация SQL запроса
    #38990799
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dsl-group,

План запроса - это несколько другое :)
Его можно увидеть, если добавить слово EXPLAIN перед запросом и выполнить его.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38990854
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оптимизация SQL запроса
    #38990857
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinamiksoftА смысл? Это ж внешняя таблица.Так связывание-то левое, а не внутреннее. И условие отбора - по левой таблице. Так что оно будет (или во всяком случае должно) применяться до связывания (во всяком случае до этапа добавления NULL-овых записей справа).

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


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

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


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



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

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


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