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 :: какими методами пользоваться? [5]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (6): « 1 2 3 4 [5] 6 »   

> Описание: какими методами пользоваться?
caballero
Отправлено: 11 Декабря, 2011 - 19:37:59
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Мне надо поменять порядок(изменить sortorder у конкретного товара) Как это сделать В вашем варианте?

Не очень понимаю. что такое порядок сортировки для конкретного товара а не для конкретного поиска по каталогу и тем более зачем это запоминать в БД. В любом случае если сортировка в пределах страницы - на сервер ходитть незачем, а если вывод многостраничный - вам все равно придется перерисовать полстраницы. Уж лучше тогда взять готовый jqGrid где уже все реализовано. Упаритесь писать руками - убедитесь сами когда перейдете от слов к делу.

Цитата:
В вашем варианте, я так подразумеваю надо делать UPDATE всей БД?

В ЛЮБОМ варианте делается апдейт НУЖНЫХ записей а не всей БД.


Цитата:
По сравнению с чем? Простого запроса? Можно источник информации? Я думаю иначе.

именно - источник любое вменяемое руководство по проектировани БД. При чем неважно какой БД. Никто в своем уме на напишет что процедура выполняется быстрее простого запроса (даже с учетом прекомпиляции)

Цитата:
Тут наверное как раз транзакции и процедуры, триггеры могут помочь???

Это все разные вещи для разных задач и помочь в данном случае не могут никак.

Цитата:
Есть $.Deffered() и очередность запросов, это не сложно. Есть callback();
Все это можно отследить

Можно но опять все сведется к блокировнию юзера пока вся цепочка не отработает. Про надежность всей этой цепочки калбаков я уже молчу.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
tuareg
Отправлено: 11 Декабря, 2011 - 19:59:33
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Цитата:

именно - источник любое вменяемое руководство по проектировани БД. При чем неважно какой БД. Никто в своем уме на напишет что процедура выполняется быстрее простого запроса (даже с учетом прекомпиляции)

Странно, а Петр Зайцев и Ко в книге Оптимизация MySQL почему-то пишет по другому.
(там пример есть INSERT 1000000 строк разница процедура 101 vs Клиентское приложение 279 vs
Клиентское приложение с соединением через MySQL Proxy 309 в секундах)
Правда он тут же пишет что выигрыш дается на простых процедурах. А на сложные мы и не замахиваемя Улыбка. Почти в 3 раза, ерунда какая.

А на счет
Цитата:

Не очень понимаю. что такое порядок сортировки для конкретного товара а не для конкретного поиска по каталогу и тем более зачем это запоминать в БД. В любом случае если сортировка в пределах страницы - на сервер ходитть незачем, а если вывод многостраничный - вам все равно придется перерисовать полстраницы. Уж лучше тогда взять готовый jqGrid где уже все реализовано. Упаритесь писать руками - убедитесь сами когда перейдете от слов к делу.

Есть группа продукты. В ней находятся товары 100шт. Нужно одновременно(т.к страницу не перегружаем пока все не поправили) Вот я переместил (хотя я даже не понимаю каков интерфейс данного чуда) один продукт с 96 позиции на 15 , и другой с 50 на 85.
Переместил(отметил новую позицию). Нажал сохранить. Вот теперь подскажите пожалуйста каков запрос MySQL.

(Отредактировано автором: 11 Декабря, 2011 - 20:00:21)

 
 Top
caballero
Отправлено: 11 Декабря, 2011 - 20:26:42
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
А на сложные мы и не замахиваемя

на запрос в 1000000 записей тоже. Впрочем вы потеряли нить разговора - речь шла о дополнительном вызове общего проверочного запроса каждый раз при апдейте аяксом.

Цитата:
В ней находятся товары 100шт.

это на одной странице? напомните кто там говорил о юзабельности.

Цитата:
Переместил(отметил новую позицию). Нажал сохранить. Вот теперь подскажите пожалуйста каков запрос MySQL.

Откуда я знаю что вы подразумеваете позицией и зачем ее перемещать. Нужен какой то критерий для перемещения. Все мне известные для сортировки (по названию, цене, популярности, рейтингу и т.д.) в перемещении не нуждаются а только в сортировке при выборке.
Если даже предположить что есть некое число с которым вы хотите связать нечто именуемое позицией то навскидку даже не представляю это одним запросом. Даже если передать массив товаров с их позиций в процедуру все равно это будет не один апдейт хотя в данном случае это будет чуть быстрее чем несколько запросов, хотя и не настолько существенно чтобы возится с медленными процедупами в Mysql


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
tuareg
Отправлено: 11 Декабря, 2011 - 20:41:50
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




caballero пишет:

это на одной странице? напомните кто там говорил о юзабельности.

А у нас style="display:none" Не работает уже?+Поиск по странице нужного товара ни как?
Таблица
id name sortorder
1 товар1 1
2 товар2 2
3 товар3 3
4 товар3 4
...
При выводе на странице сайта ... Order by sortorder.
Вот теперь я хочу чтобы товар с id=1 выводился третьим
Т.е таблица будет станет такая(теоретически)
1 товар1 3
2 товар2 1
3 товар3 2
4 товар3 4
А потом id=3 выводился 4
1 товар1 2
2 товар2 1
3 товар3 4
4 товар3 3
Вот поидее как должно получиться???
Вот теперь как это сделать? Я реально не понимаю как вы это собираетесь делать?
Поэтапно я знаю как, а тут ...
P.S На счет медленных процедур там пост выше есть.
 
 Top
caballero
Отправлено: 11 Декабря, 2011 - 20:51:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
На счет медленных процедур там пост выше есть.

Это зависит о сервера
В mysql все медленное и триггера и процедуры - просто там нет нормального оптимизатра - mysql не для этого предназначен
в промышленных серверах - да
но там свои особенности в некоторых таких как DB2 на каждую процедуру создается отдельная транзакция со своими вытекающими отсюда особенностями. В любом случае однократный вызов простого запроса быстрее этого же запроса внутри процедуры.

Цитата:
Вот теперь как это сделать? Я реально не понимаю как вы это собираетесь делать?

Сделать можно массой способов. Например запоминать в массиве последовательность перемещений.
Хотя для абстрактного примера имеющего мало общего с практической реальностью и решений нормальных не бывает.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
tuareg
Отправлено: 11 Декабря, 2011 - 21:00:08
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Цитата:

Это положительно сказывается на безопасности и позволяет более
точно управлять привилегиями. Типичный пример – хранимая процедура для перевода средств с одного банковского счета на другой;
она выполняет операцию в контексте транзакции и протоколирует ее для последующего аудита. Можно дать приложению право вызывать хранимую процедуру, не открывая доступ к используемым в ней таблицам.

Это цитата из книги. Человека, который разрабатывал(-ет) MySQL
Цитата:

Хотя для абстрактного примера имеющего мало общего с практической реальностью и решений нормальных не бывает.

Идея выводить товары, так как я хочу не по цене, названию ... А просто ткнул хочу первым, хочу вторым. Это абстрактная идея? Не понял
 
 Top
caballero
Отправлено: 11 Декабря, 2011 - 22:50:06
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Это цитата из книги. Человека, который разрабатывал(-ет) MySQL

Ну и где тут сказано что выполнение процедуры с запросом быстрее того же запроса выполненого напрямую.

Цитата:
Идея выводить товары, так как я хочу не по цене, названию ... А просто ткнул хочу первым, хочу вторым. Это абстрактная идея?

Разумеется, к и все что руководствуется принципом "я хочу" вместо "имеет смысл и необходимость".
При чем это хотение совершенно не согласовывается с надежностью системмы.
Переместил товар отправил апрос на сервер - инет глюкнул. В базе одна сортировка на странице другая. пошел перемещать дальже - в базу пошли цже кривые данные и т.д.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
tuareg
Отправлено: 11 Декабря, 2011 - 23:10:56
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




caballero пишет:
Ну и где тут сказано что выполнение процедуры с запросом быстрее того же запроса выполненого напрямую.

Пример выше Вы я так понял не читали??? Про миллион вставок??? Улыбка
Ссылку я привел про целостность данных при процедуре.
caballero пишет:
Разумеется, к и все что руководствуется принципом "я хочу" вместо "имеет смысл и необходимость".
При чем это хотение совершенно не согласовывается с надежностью системмы.

Это Вы заказчику объяснить попытаетесь?
caballero пишет:
Переместил товар отправил апрос на сервер - инет глюкнул. В базе одна сортировка на странице другая. пошел перемещать дальже - в базу пошли цже кривые данные и т.д.

Вы вообще представляете как это все работает??? Логику и внешний вид??? На каком этапе может произойти сбой если система построена т.о
Я нажал на клавишу мыши захватил строку. Начал перемещать.(для особо кривых рук, можно указать куда (по направлению горизонт/вертикаль) и родительский элемент Улыбка )
Пока я не отпустил мышку ничего никуда не отправляется.
Я отпустил(если на туже позицию тоже ничего), а вот если позиция поменялась тогда ajax.
Где callback-функция содержит проверку, если ошибка, то вернется все на место.
Страница не перерисовывается, она готова полностью к дальнейшей работе.
Даже если на этапе отправки запроса произошел сбой. Единственный сбой, который сложно предусмотреть, это разрыв соединения по timeout. Тут нужно просто подумать чуток. Как определять тип ошибки т.е ошибка соединения(и тогда одно) или все-таки ошибка в приложении. И дествовать соответственно.
 
 Top
caballero
Отправлено: 11 Декабря, 2011 - 23:23:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Пример выше Вы я так понял не читали??? Про миллион вставок???

Пример некорректный
при миллионе вставок очевидно что если программист не новичок, то запрос
будет прекомпилирован(prepared) и по любому будет работать быстрее. По любому - миллион вызовов процедур и вызовов запроса внутри будет медленне просто миллиона запросов.


Цитата:
Где callback-функция содержит проверку, если ошибка, то вернется все на место.

Ну и как ты определишь когда произошла ошибка до вставки в БД или после. У тебя инет сбойнул - HTTP протокол это тебе не транзакционная БД. Или скрипт завис потому что что ты своими манипуляциями надул память и вызвался сборщик мусора который в большинстве яваскриптовых движков - тупой как сибирский валенок. Или просто по таймауту отвалился от сервера.

(Отредактировано автором: 11 Декабря, 2011 - 23:35:20)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
tuareg
Отправлено: 11 Декабря, 2011 - 23:48:29
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




caballero пишет:
Пример некорректный
Черт с ними с процедурами. Пускай каждый решает сам, мне они нравятся больше. Улыбка

caballero пишет:
Ну и ты определишь когда произошла ошибка до вставки в БД или после. У тебя инет сбойнул - HTTP протокол это тебе не транзакционная БД. Или скрипт завис потому что что ты своими манипуляциями надул память и вызвался сборщик мусора который в большинстве яваскриптовых движков - тупой как сибирский валенок. Или просто по таймауту отвалился от сервера.

Во-первых это единственная проблема. На вскидку прямо так если:
Итак по умолчанию timeout=60 сек(писали выше я если честно не знаю)
Я если правильно понимаю сработает .error() запроса==> принудительно обновляем страницу. Js это умеет.
Иначе complete()--->по рез-ту запроса опять же флаг 1/0.
В обоих случаях сначала выводим сообщение типа "произошла ошибка". Да и можно перегрузить страницу, это тоже не критично.
Ну как сработает нормально?
На счет утечек памяти. Я уже писал. Что в принципе на это стоит обращать внимание, но с другой стороны допустим jQuery постоянно развивается. Они сами же его оптимизируют. Если есть желание можно найти тесты и т.д. Баги которые обнаруживаются устраняются. Я ведь не призываю пользоваться beta версией. Использовать стабильный релиз.
Единственно по работе, я столкнулся, что при отладке при большом количестве вставок DOM и включенном FierBug-е да появляются тормоза. При выключенном все работает как секунды.
 
 Top
caballero
Отправлено: 11 Декабря, 2011 - 23:59:58
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Черт с ними с процедурами. Пускай каждый решает сам, мне они нравятся больше.

Нравится может девушка а не размазываение бизнес логики между кодом сервера и процедупами.

Цитата:
Да и можно перегрузить страницу, это тоже не критично.

Это единсивенный способ гарантировать соответствие БД содержимому страницы. Можно даже аяксом перегружать но это сложнее и никакого преимущества пос корости даже теретического.

В принципе можно такой алгоритм - если возвращается нормальный код то оставляем как есть, если код ошибки заведемо определенный с скрвера - возвразаем обратно. Если код непонятно какой перечитываем страницу.
Но надежность все равно низкая и все равно надо блокировать пользователя чтобы не начал переставлять товары пока не засейвился предыдущий удачно.
Как ни крути для таких страниц аякс - не лучшее решение. Тем более увидит сие гениальное творение только админ сайта.

(Отредактировано автором: 12 Декабря, 2011 - 00:01:06)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
tuareg
Отправлено: 12 Декабря, 2011 - 00:17:45
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




caballero пишет:
Нравится может девушка а не размазываение бизнес логики между кодом сервера и процедупами.

Хорошо специально для Вас
Цитата:

Для каждого соединения (connection) ведется отдельный кэш планов
выполнения хранимых процедур, но только в рамках соединения.

Цитата:

Сервер кэширует планы выполнения хранимых процедур, что снижает накладные расходы на повторные вызовы

Следовательно в примере с 1000000 строк сам запрос не кэшируется, т.к процедура вызывалась один раз или может я не правильно понимаю кэш планов?
т.е быстрее он выполнился ...
Цитата:

Хранимая процедура работает гораздо быстрее,главным образом из-за отсутствия накладных расходов на передачу по сети, разбор, оптимизацию и т. д.

Это справедливо для простых запросов. Но сложную логику можно и на PHP сделать

caballero пишет:
В принципе можно такой алгоритм - если возвращается нормальный код то оставляем как есть, если код ошибки заведемо определенный с скрвера - возвразаем обратно. Если код непонятно какой перечитываем страницу.

Я Вам разве не про него писал??? Т.е фактически мы получаем следующее. Если все нормально сработал ajax пользователь спокоен все хорошо. Улыбка
Если приложение написано без ошибок(в PHP и запросах), то следовательно 99% запросов будут летать..
А ошибки на то они и ошибки, чтобы их исправлять
Ошибки соединения мы тоже обошли. Все счастливы и довольны. Осталось только не лениться и написать 10-20 строчек кода и все будет хорошо.

(Отредактировано автором: 12 Декабря, 2011 - 00:22:15)

 
 Top
caballero
Отправлено: 12 Декабря, 2011 - 00:56:20
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Сервер кэширует планы выполнения хранимых процедур, что снижает накладные расходы на повторные вызовы

Точно так же он закеширует если запрос будет прекомпилирован. И не забывайте про накладные расходы по самому вызову процедуры. Вызов миллион процедур не самое удачное ее применение. Вот если в процедуре вызвать миллион запросов это другое дело.


Цитата:
Это справедливо для простых запросов. Но сложную логику можно и на PHP сделать

разумеется всю логику нужно делать в одном месте - это упрощает понимание кода и отладку (отладка хранимок - гемор еще тот). Но иногда процедура очень полезна - например надо пройтись курсором по записям и проделать там какие нибудь изменения. Или собрать данные в набор когда одним запросом накрутить не получится. Лет 30 назад когда не было высокоуровневых языков и сред разработки а приложения строились по двухзвенной схеме, тогда бизнес логика писалась в основном в процедурах.
Но в Mysql процедуры не слишком эфективны по скорости, не говоря уже про нагрузку на сервер.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
tuareg
Отправлено: 12 Декабря, 2011 - 01:09:44
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Что ж Вы не верите то а...
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. CREATE PROCEDURE insert_many_rows (IN loops INT)
  3. BEGIN
  4. DECLARE v1 INT;
  5. SET v1=loops;
  6. WHILE v1 > 0 DO
  7.   INSERT INTO test_table VALUES(NULL,0,
  8.     ‘qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt’,
  9.     ‘qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt’);
  10.    SET v1 = v1 - 1;
  11. END WHILE;
  12. END
  13.  

Вот эта процедура. Прямо из книги...
caballero пишет:

Точно так же он закеширует если запрос будет прекомпилирован. И не забывайте про накладные расходы по самому вызову процедуры. Вызов миллион процедур не самое удачное ее применение. Вот если в процедуре вызвать миллион запросов это другое дело.

Если я правильно понимаю то вызывается сие чудо так
CALL insert_many_rows(1000000);
Она вызывается один раз. И тут нет подготовленных выражений. Я прав?
фактически это равносильно
PHP:
скопировать код в буфер обмена
  1.  
  2. /*подключение и т.д*/
  3. $i=1000000;
  4. while($i--){
  5.  mysql_query('INSERT INTO test_table values(NULL,0,
  6.   ‘qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt’,
  7.   ‘qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt’);');
  8. }
  9.  

Я прав? И если я прав, то объясните мне пожалуйста очень интересно. Как процедура оказалась быстрее почти в 3 раза. Если все процедуры MySQL медленные?
 
 Top
caballero
Отправлено: 12 Декабря, 2011 - 01:15:27
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Она вызывается один раз. И тут нет подготовленных выражений. Я прав?
фактически это равносильно

Равносильно но сравнивать не корректно.

Не понимаете разницу между вызовом одной процедуры с миллионом запросов и вызовом миллиона процедур с одним запросом?
(Добавление)
Однократный вызов процедуры тоже будет медленнее однократного вызова прекомпилированного (prepared) запроса а в mysql скорее всего даже обычного.
Теория - одно а практика другое. На практике все сервера БД не соответствуют реляционной алгебре. Ну и толк цитировать книги отцов-основателей.

Представте себе строку в программе и ту же строку в функции которую надо вызвать. Что будет быстрее?

(Отредактировано автором: 12 Декабря, 2011 - 01:21:43)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (6): « 1 2 3 4 [5] 6 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB