CoopeR
25.10.2013 - 09:33
Добрый день Форумчане!) Начал изучать php, уже получилось набросать свою мини CMS-ку, решил уменьшить запросы и немного оптимизировать код
Пример:
есть таблица со статьями, есть таблица с меню откуда берется навигация по сайту
- Главная(50)
- Ссылка(15)
- Ссылка(20)
- Контакты
лучше добавить 1 запрос в базу который подсчитает колл статей с определённым id (через count())
или
добавить в таблицу с меню 1 поле в который из админку будет добавляться +1
Игорь_Vasinsky
25.10.2013 - 09:52
Цитата |
лучше добавить 1 запрос в базу который подсчитает колл статей с определённым id (через count()) |
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
А что значит
Цитата |
колл статей с определённым id |
? ID должен быть уникальным, на то он и идентификатор. Или имеется ввиду ID родителя? Тогда второй вариант предпочтительнее. Причем сделать это можно внешними ключми.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
CoopeR
25.10.2013 - 10:22
Цитата (twin @ 25.10.2013 - 10:07) |
? ID должен быть уникальным, на то он и идентификатор. Или имеется ввиду ID родителя? Тогда второй вариант предпочтительнее. Причем сделать это можно внешними ключми. |
сделал вот так:
<?php
$array = array();
$sql_menu= "SELECT * FROM menu";
$sel_menu= mysqli_query($sql_menu);
while( $menu= mysqli_fetch_assoc($sel_menu) ){
$array[] = $menu;
}
foreach ($array as $menu): ?>
<a href="<?=$menu['url']?>"><?=$menu['name']?>
<span><?=$menu['kolichestvo']?></span>
</a>
<?php endforeach; ?>
избавился от дополнительного запроса
SELECT id_menu, COUNT(*) FROM menu GROUP BY id_menu;
правильно ли я сделал?
bestxp
25.10.2013 - 11:50
каждый уважающий себя новичок должен написать свою кмс и понять что она безполезна, написать свой фреймворк и понять что нах он это сделал xD
По сути темы еще бы добавил все зависит от частоты добавления новости и от типа таблицы.
Цитата |
избавился от дополнительного запроса |
но добавил 5 дополнительных запросов update для поля. В таблицах INNODB блокировка update на уровне строки, в MYISAM на уровне таблицы и еще COUNT(*) в таблицах MYISAM хранится в заголовке таблицы и берется оттуда мгновенно, а в INNODB идет перебор строк, правда не самих строк с их значениями, а их инкрементов, но с правильно проставленными индексами все будет достаточно быстро.
Я тоже склоняюсь больше ко второму варианту, особенно если меню центральное и появляется на каждой странице, было бы неоправданно каждый раз делать "безсмысленный" запрос, чтоб узнать, то, на что юзеру в принципе ***** .
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
T1grOK
25.10.2013 - 12:24
Цитата (bestxp @ 25.10.2013 - 07:50) |
каждый уважающий себя новичок должен написать свою кмс и понять что она безполезна, написать свой фреймворк и понять что нах он это сделал xD |
Как раз попытки, реализовать что-то конкретное дают незаменимый опыт. Особенно дает ощутимый прирост прокачки "скила" в начинаниях.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
bestxp
25.10.2013 - 12:28
Цитата (T1grOK @ 25.10.2013 - 12:24) |
Цитата (bestxp @ 25.10.2013 - 07:50) | каждый уважающий себя новичок должен написать свою кмс и понять что она безполезна, написать свой фреймворк и понять что нах он это сделал xD |
Как раз попытки, реализовать что-то конкретное дают незаменимый опыт. Особенно дает ощутимый прирост прокачки "скила" в начинаниях.
|
так я об этом и говорю =)
через это проходит каждый
кто-то скрывает, а кто-то нет)
А что, если при запросе на получение из бд статей вывести их количество mysqli_num_rows? В таком случае запрос с полем count() не пригодиться.
mvg
При выполнении COUNT(*), сервер будет только выделять память только для хранения результата подсчета строк.
При использовании mysqli_num_rows, сервер будет обрабатывать весь результирующий набор, выделяя память для всех тех же результатов, но работать будет в режиме выборки, которая включает в себя много различных деталей, таких как блокировка и т.д.
mysqli_num_rows обычно подходит для обычной проверки на наличие строк, перед mysqli_fetch_assoc и как правило с указанным LIMIT.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
andrey888
25.10.2013 - 13:44
Цитата |
каждый уважающий себя новичок должен написать свою кмс и понять что она безполезна, написать свой фреймворк и понять что нах он это сделал xD |
Ну не у всех бесполезные ) кто то написал - пользуется, улучшает, и при этом как правильно подметил T1grOK еще и скиллс свои повышает ).
_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
CoopeR
25.10.2013 - 14:03
to ABC
Цитата |
Извините не смог удержаться: laugh.gif |
Посмеялся от души))
как сказал T1grOK всё получается на практике, зато я столько вещей узнал, тоны примеров посмотрел, подогнал под свои нужды, вопрос только в оптимизации
Цитата |
все зависит от частоты добавления новости и от типа таблицы |
Это обычный бложик, максимум пару статеек в день поэтому избавится от лишних запросов при выводе приоритетней увеличения запросов при добавлении
только вот вопрос про INNODB и MYISAM не совсем разобрался что выбрать, почитал что это такое, почитал что люди пишут про выбор между ними, нужно реально на практике проверить что будет быстрей работать, лично я склоняюсь к MYISAM и таблицы у меня на MYISAM
andrey888
25.10.2013 - 14:25
CoopeRне знаю может ты в целях конфиденциальности информации тут выложил запрос так
$sql_menu= "SELECT * FROM menu";
но если ты реально так используешь запрос на тех страницах где лазит Юзер + тебе нужна оптимизация ТО первым делом убирай * и вместо нее ставь нужные для выборки поля БД.
Если этот запрос для админки где ты лазишь один - то можно и так оставить , дабы при последующем улучшении функционала меньше рыться в запросах. (ток не переборщи)
_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
Цитата |
лично я склоняюсь к MYISAM и таблицы у меня на MYISAM |
а у меня вот все наоборот
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
CoopeR
25.10.2013 - 14:44
Ну теперь я ещё и зарегался на форуме))
спасибо за быстрые ответы)
to andrey888 это был пример конечно
а чем плоха звёздочка в запросе?
вот например есть такой запрос:
"SELECT blog.*, COUNT(comm.id) AS comms FROM blog LEFT JOIN comm ON blog.id = comm.blog_id
WHERE show = 'show' GROUP BY blog.id ORDER BY date DESC LIMIT $start,$numb_page"
где blog это таблица со статьями а comm таблица с комментариями
выводит на главной превьюшку статьи и количество комментов в ней
или мне в запросе перечислять все поля которые мне нужны? вроде все нужны
_____________
Нажимаю "Мой компьютер"... не моет, сукоо...
Познакомлюсь с девушкой, можно крякнутая версия...
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.