Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Оптимиз. MySQL-процедуры
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
.
Так..
Чесслово, пишу процедуру, и вообще процедуру на мускуле впервые в жизни.
Ну вот не доводилось.
Написал - оказалось ничего сложного.
Однако.. есть несколько вопросов.
Сперва сам код:
Этот кусок кода получает id редактируемого элемента и parent_id - желаемый id родителя.
Структура таблицы проста как дважда-два:
id | parent_id | name
Я проверяю, что "кандидат" на родителя не является в данный момент потомком целевого объекта,
а так же потомки потомков [потомков...[потомков...[потомков...]]] целевого объекта не являются "кандидатом" на родителя.
Теперь вопросы:
1) OUT status в аргументах процедуры - это что-то типа global $status в функции в php?
2) Когда я только объявляю курсор, запрос уже выполняется или это происходит только при OPEN курсора?
3) Второй OPEN идет за данными еще раз?
4) В первом цикле идет обход ближайших непосредственных потомков, без ухода в рекурсию, если найдено, я не пойду в рекурсию, а верну успех. Второй цикл идет уже именно по рекурсивным потомкам. Так вот, я пробовал по разному, я не знаю как, возможно есть способ ресетнуть курсор в начало и не ходить еще раз. именно по незнанию я открываю курсор еще раз. как сикануть в начало выборки чтобы не делать еще один OPEN?
5) Является ли status зарезервированным словом в MySQL?
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
пока Мелкий спит попробую ответить сам
1. нет, это именно out как в некоторый ЯП. через такой параметр можно возвращать результат назад. При вызове разумеется там должна быть переменная а не число.
счтьай что это передача по указателю или ссылке
2. происходит при FETCH
3. второй Fetch.
4. чето мудрено. резетнуть наверно вряд ли нужно просто переоткрыть
курсор - он скорее всего читается в одну сторону.
и вообще помнится ты тут агитировал за nested sets а тут какие то жуткие рекурсии на процедурах как будто это оракл а не мускул.
5) скорее всего нет - во всяком случае я такое употреблял без кавычек
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Появился еще один:
6) По сути выборку я делаю только внутри процедуры, ничего не возвращая наружу из этих запросов. Нужна ли тут эта READS SQL DATA?
Ответы:
1) Отлично, на это и расчитывал.
2) Ок.
3) Ок.
4) Жаль что переоткрывать - это же лишний запрос. [про nested sets и про "мудрено" ниже]
5) Ну, процедура работает, значит вроде как не зарезервированное, однако в коде это слово в нижнем регистре, а форум подсветил его в верхний, что навело на мысль.
caballero +1 в карму.
Я никогда яро не агитировал за нестед сетс.
Просто тут пару раз подряд вопросы такие всплывали, я и говорил что есть такая штука.
Насчет мудрено - это ж придумано чтобы было меньше запросов в циклах.
Насчет вообще почему не нестед сетс - это поехало еще с ранней версии - так и осталось.
Позже буду пересматривать и добавлю нестед сетс (хлебные крошки тащить точно сложно).
Однако сама процедура выполняется достаточно быстро,
потому, что для каждого вложенного уровня потомков совершает в лучшем случае один запрос,
в худшем два, для того чтобы провалиться на еще один уровень глубже.
А самих уровней вложений на сайте редко бывает более пяти.
Это максимум 10 несложных запросов в цикле за одну транзакцию.
Даже для 20 тыс записей в дереве - это фигня.
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Это максимум 10 несложных запросов в цикле за одну транзакцию.
Даже для 20 тыс записей в дереве - это фигня.
так зачем вообще процедура - бегай обычными запросами или вообще в массивы выгреби и бегай там.
это не очень красиво и немного медленнее но зато намного проще.
деревья действительно редко бывают большими - в природе просто нет таких иерархий. Да и юзер не станет лазить по такому лереву (Добавление)
а рекурcии можно избежать если не с помощью nestedsets тот с materialized path точно
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
caballero пишет:
это не очень красиво и немного медленнее но зато намного проще.
Таки дело принципа. Даже не остановило то, что эта процедура дергается только в момент сохранения редактируемого документа в админке.
А бегать запросами (транзакциями) на сервер тоже не хорошо - теряется время на пинание данных туда-обратно.
Это же те самые запросы в циклах на стороне пыха, о которых говорят "ффуууу!".
caballero пишет:
деревья действительно редко бывают большими
Да, но надо быть к ним готовым
Тут их уже 4 уровня, с товарами будет какраз те самые пять.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
В MySQL хранимые процедуры, к сожалению, оставляют желать лучшего. Поэтому почти всегда - лучше строить логику на уровне скриптов.
Ну и дерево иерархии можно реализовать двумя уровнями вложенности всегда.
По поводу 6 - READS SQL DATA означает, что процедура читает данные, собственно, но не записывает ничего (использует SELECT, но не INSERT/UPDATE/DELETE)
В MySQL это имеет характер "рекомендательной" опции, то есть реального эффекта оно не имеет никакого.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DeepVarvar
Отправлено: 12 Апреля, 2013 - 00:06:41
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
EuGen пишет:
Поэтому почти всегда - лучше строить логику на уровне скриптов
Я таки посчитал, что в моем случае - лучше процедурой.
6) Да, я читал, что это не обязательная опция, но были некоторые сомнения.
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
ну и сколько там будет категорий что их нельзя выгрести массивом, тем более так намного проще строить дерево на странице - сортируешь массив так чтобы дети шли позже родителей и строишь дерево одним проходом.
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
caballero пишет:
ну и сколько там будет категорий что их нельзя выгрести массивом
Дядь, не поверишь - все дерево.
Нет категорий.
Нет модулей (за исключение поиска, карты сайта, maybe etc..).
Есть возможная бесконечная вложенность (вкладываемость) одних документов в другие.
Есть типы (прототипы) документов, которые определяют индивидуальные информационные поля документа.
Так внутри новости может лежать товар, например, или наоборот..
Абсолютно всеравно чего захочет админ.
Так что тащить придется все дерево (возможно ~20 тыс айдишников) чтобы пробежаться по массиву.
Спасибо - неохота
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
при чем тут апи?
идея друпала - все строится на таксономии
страницы формы данные и все прочее являются нодами - узлами некоего супердерева.
и админ может это все в определенных пределах перекладывать - как минимум формировать страницы из более мелких нодов.
дебильные хуки на которых строится его апи - это отдельная песня
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.