Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Если возможно, помогите оптимизировать кусок кода 
:(
    Опции темы
PROme2
Дата 14.2.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



если можно, думаю, точно должен быть более оптимальный вариант
простой счетчик обращений:

Код

@$my_result=mysql_query("SELECT `count` FROM `top_articles_view` WHERE `article_id`='$id' LIMIT 1");
@$CUR_ART_VIEW_COUNT=mysql_result($my_result, 0, "count");
if ($CUR_ART_VIEW_COUNT=='')
{
@$my_result=mysql_query("INSERT INTO `top_articles_view` ( `article_id` , `count` ) VALUES ('$id', '1')");
}
else
{
$CUR_ART_VIEW_COUNT++;
@$my_result=mysql_query("UPDATE `top_articles_view` SET `count`='$CUR_ART_VIEW_COUNT' WHERE `article_id`='$id' LIMIT 1");
}


Код

CREATE TABLE `top_articles_view` (
  `article_id` mediumint(8) unsigned NOT NULL default '0',
  `count` mediumint(8) unsigned NOT NULL default '0',
  UNIQUE KEY `article_id` (`article_id`),
  KEY `count` (`count`)
) TYPE=MyISAM;


цель - оптимизация с целью уменьшения нагрузки на сервер, сорри за каламбур smile

ЗЫ: заранее благодарю за ответы smile

Это сообщение отредактировал(а) PROme2 - 14.2.2006, 21:39
PM MAIL   Вверх
Mal Hack
Дата 15.2.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



1. @ не там ставишь smile Вообще их убрать лучше, а вырубить вывод ошибок через .htaccess, к примеру.

Цитата(PROme2 @ 14.2.2006, 21:38 Найти цитируемый пост)
if ($CUR_ART_VIEW_COUNT=='')

ТО он у тебя как строка, то потом, как число...
Что это у тебя за переменная? Отсюда можно будет кое-что улучшить.
PM ICQ   Вверх
PROme2
Дата 15.2.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Цитата

1. @ не там ставишь

smile на mysql_query типа можно не ставить?

Цитата

Вообще их убрать лучше, а вырубить вывод ошибок через .htaccess, к примеру

угу, но мне ваще надо бы чтобы их выводило... можно как-то только ошибки, связанные с бд отключить? ну в смысле сообщения о них smile

Цитата

ТО он у тебя как строка, то потом, как число...

у меня такая привычка
это так плохо? просто я так догадываюсь, пхп в любом случае каждый раз проводит определение типа переменной при каждой операции с ней и не важно как писать... или важно? smile
лучше может

Код

if (!is_numeric($CUR_ART_VIEW_COUNT))

?

Цитата

Что это у тебя за переменная?

ну типа количество запросов с id таким-то

пасиба smile
PM MAIL   Вверх
Mal Hack
Дата 15.2.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(PROme2 @ 15.2.2006, 11:07 Найти цитируемый пост)
угу, но мне ваще надо бы чтобы их выводило... можно как-то только ошибки, связанные с бд отключить? ну в смысле сообщения о них smile

Ошибки должны ьвыводиьтся только на этапе отладки. Когда скрипт уже портируется на сайт ничего выводиться не должно.
По хорошему, все исключения надо обрабатывать.

Цитата(PROme2 @ 15.2.2006, 11:07 Найти цитируемый пост)
у меня такая привычка
это так плохо? просто я так догадываюсь, пхп в любом случае каждый раз проводит определение типа переменной при каждой операции с ней и не важно как писать... или важно? smile

Вообще-то все-таки важно.

Цитата(PROme2 @ 15.2.2006, 11:07 Найти цитируемый пост)
if (!is_numeric($CUR_ART_VIEW_COUNT))

Я бы на твоем месте == 0 проверял. Или <1.
PM ICQ   Вверх
PROme2
Дата 16.2.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Цитата

Ошибки должны ьвыводиьтся только на этапе отладки. Когда скрипт уже портируется на сайт ничего выводиться не должно.

угу, но в данном случае своя специфика есть smile

Цитата

Я бы на твоем месте == 0 проверял. Или <1.


ну можно, хотя особой разницы не вижу
вообще меня больше волнует сторона БД

ну ладно, смотрю что особо ничего и сделать нельзя, если будет напрягать, тогда будем делать статистику посуточную, а не в риалтайме
пасиба за помощь smile
PM MAIL   Вверх
CTAPbIuMABP
Дата 20.2.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 17.2.2006
Где: Киев

Репутация: -1
Всего: 1



Код

$my_result=@mysql_query("SELECT `count` FROM `top_articles_view` WHERE `article_id`='$id' LIMIT 1");
$CUR_ART_VIEW_COUNT=@mysql_result($my_result, 0, "count");
if (!$CUR_ART_VIEW_COUNT) // или так $CUR_ART_VIEW_COUNT === FALSE
{
$my_result=@mysql_query("INSERT INTO `top_articles_view` VALUES ('$id', '1')");
}
else
{
$my_result=@mysql_query("UPDATE `top_articles_view` SET `count`=`count`+1 WHERE `article_id`='$id'");
}



PM WWW ICQ Skype   Вверх
PROme2
Дата 22.2.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



CTAPbIuMABP, земляк, спасибо smile
кстати, что делает оператор "==="? уже второй раз встречаю... суть ясна, а именно?

и что касается

Код

"INSERT INTO `top_articles_view` VALUES ('$id', '1')"


и

Код

"INSERT INTO `top_articles_view` ( `article_id` , `count` ) VALUES ('$id', '1')"


мое большое ИМХО, мой вариант таки быстрее должен работать, обязательно устрою тестирование и отрапортую по результатам smile
аналогично и по UPDATE запросу, просто мне не ясно кто будет проводить инкремент, php или mysql? smile
PM MAIL   Вверх
PROme2
Дата 22.2.2006, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



такс, устроил тест по модифицированному инсерту, после 100 прогонов результаты:

минимум
среднее
максимум

мой вариант:

[34.2705]
[35.1326]
[36.1185]

модификация CTAPbIuMABP:

[30.9217]
[33.2995]
[34.1928]

что ж, скромный прирост, но резон провести такую примитивную модификацию есть, 5% на дороге не валяются, худший результат оказался даже чуть лучше моего лучшего

далее идет апдейт, я, кстати, вначале был немного невнимателен, ясен пень что в модифицированном варианте инкремент выполняет mysql

мой вариант:

[70.1257]
[72.4921]
[74.8306]

модификация CTAPbIuMABP:

[71.0656]
[72.8688]
[74.7647]

отличия нечтожны... а вот модификация апдейта - `count`=`count`+1 вызвала у меня желание убрать $CUR_ART_VIEW_COUNT, а для проверки наличия соотв. id в табличке применить mysql_num_rows... к сожалению, опять же ничтожное приемущество, доли процентов, можно сослаться на погрешность эксперементов... просто селект забирал порядка 95-97% времени, что уж тут поделаешь...?

также добавление к апдейту убранного LIMIT 1 ничего явного не принесло, снова доли процентов, полагаю это заслуга структуры бд - UNIQUE KEY `article_id`

ЗЫ: CTAPbIuMABP еще раз благодарю за помощь smile

Это сообщение отредактировал(а) PROme2 - 22.2.2006, 03:07
PM MAIL   Вверх
CTAPbIuMABP
Дата 22.2.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 17.2.2006
Где: Киев

Репутация: -1
Всего: 1



Наздоровье) если не жаль репутации подкинь ;)

Оператор === читается как эквивалентно тоесть, если у тебя строка

Код

if ($var=="")
// или
if ($var==0)

и ты не знаеш зарание будет ли $var string или integer можно писать так
Код

if ($var===FALSE)
//или
if (empty($var))


тоже самое, если у тебя
Код

if (!empty($var)) // $var!==0 $var!=="" $var!==NULL

можно писать
Код

if ($var===TRUE)


Добавлено @ 12:35
кстати на форуме dklab.ru меня научили еще более извращенному приему

Код

if (FALSE!=$var)
if (FALSE!==$var)


но вот так нельзя

Код

if (FALSE=$var)
if (FALSE==$var)


потосму что константу сравнивать можно, а присвоеть значение ей нельзя

Это сообщение отредактировал(а) CTAPbIuMABP - 22.2.2006, 12:37
PM WWW ICQ Skype   Вверх
PROme2
Дата 22.2.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Цитата

Наздоровье) если не жаль репутации подкинь ;)

для этого надо минимум 100 постов иметь... smile

if (FALSE==$var) так нельзя? почему это? можно же...
PM MAIL   Вверх
CTAPbIuMABP
Дата 22.2.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 17.2.2006
Где: Киев

Репутация: -1
Всего: 1



это я немного увлекся))) конечно можно)))

PS кажется, если не можеш сам, можно модера просить))))

Это сообщение отредактировал(а) CTAPbIuMABP - 22.2.2006, 18:42
PM WWW ICQ Skype   Вверх
Mal Hack
Дата 22.2.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



CTAPbIuMABP, выпрашивать репу нельзя !
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.