[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Что лучше? +1 запрос в MSQL или +1 таблица в базе
Страницы: 1, 2
CoopeR
Добрый день Форумчане!) Начал изучать php, уже получилось набросать свою мини CMS-ку, решил уменьшить запросы и немного оптимизировать код

Пример:
есть таблица со статьями, есть таблица с меню откуда берется навигация по сайту
  • Главная(50)
  • Ссылка(15)
  • Ссылка(20)
  • Контакты

лучше добавить 1 запрос в базу который подсчитает колл статей с определённым id (через count())
или
добавить в таблицу с меню 1 поле в который из админку будет добавляться +1
Игорь_Vasinsky
Цитата
лучше добавить 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
twin
А что значит
Цитата
колл статей с определённым id
? ID должен быть уникальным, на то он и идентификатор. Или имеется ввиду ID родителя? Тогда второй вариант предпочтительнее. Причем сделать это можно внешними ключми.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
CoopeR
Цитата (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
каждый уважающий себя новичок должен написать свою кмс и понять что она безполезна, написать свой фреймворк и понять что нах он это сделал xD
GET
По сути темы еще бы добавил все зависит от частоты добавления новости и от типа таблицы.
Цитата
избавился от дополнительного запроса

но добавил 5 дополнительных запросов update для поля. В таблицах INNODB блокировка update на уровне строки, в MYISAM на уровне таблицы и еще COUNT(*) в таблицах MYISAM хранится в заголовке таблицы и берется оттуда мгновенно, а в INNODB идет перебор строк, правда не самих строк с их значениями, а их инкрементов, но с правильно проставленными индексами все будет достаточно быстро.
Я тоже склоняюсь больше ко второму варианту, особенно если меню центральное и появляется на каждой странице, было бы неоправданно каждый раз делать "безсмысленный" запрос, чтоб узнать, то, на что юзеру в принципе ***** .

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
T1grOK
Цитата (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
Цитата (T1grOK @ 25.10.2013 - 12:24)
Цитата (bestxp @ 25.10.2013 - 07:50)
каждый уважающий себя новичок должен написать свою кмс и понять что она безполезна, написать свой фреймворк и понять что нах он это сделал xD

Как раз попытки, реализовать что-то конкретное дают незаменимый опыт. Особенно дает ощутимый прирост прокачки "скила" в начинаниях.

так я об этом и говорю =)

через это проходит каждый wink.gif кто-то скрывает, а кто-то нет)
mvg
А что, если при запросе на получение из бд статей вывести их количество mysqli_num_rows? В таком случае запрос с полем count() не пригодиться.
GET
mvg

При выполнении COUNT(*), сервер будет только выделять память только для хранения результата подсчета строк.

При использовании mysqli_num_rows, сервер будет обрабатывать весь результирующий набор, выделяя память для всех тех же результатов, но работать будет в режиме выборки, которая включает в себя много различных деталей, таких как блокировка и т.д.
mysqli_num_rows обычно подходит для обычной проверки на наличие строк, перед mysqli_fetch_assoc и как правило с указанным LIMIT.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
andrey888
Цитата
каждый уважающий себя новичок должен написать свою кмс и понять что она безполезна, написать свой фреймворк и понять что нах он это сделал xD


Ну не у всех бесполезные ) кто то написал - пользуется, улучшает, и при этом как правильно подметил T1grOK еще и скиллс свои повышает ).


_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
CoopeR
to ABC
Цитата
Извините не смог удержаться: laugh.gif

Посмеялся от души))
как сказал T1grOK всё получается на практике, зато я столько вещей узнал, тоны примеров посмотрел, подогнал под свои нужды, вопрос только в оптимизации
Цитата
все зависит от частоты добавления новости и от типа таблицы

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

только вот вопрос про INNODB и MYISAM не совсем разобрался что выбрать, почитал что это такое, почитал что люди пишут про выбор между ними, нужно реально на практике проверить что будет быстрей работать, лично я склоняюсь к MYISAM и таблицы у меня на MYISAM
andrey888
CoopeR
не знаю может ты в целях конфиденциальности информации тут выложил запрос так

$sql_menu= "SELECT * FROM menu";

но если ты реально так используешь запрос на тех страницах где лазит Юзер + тебе нужна оптимизация ТО первым делом убирай * и вместо нее ставь нужные для выборки поля БД.

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

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
GET
Цитата
лично я склоняюсь к MYISAM и таблицы у меня на MYISAM


а у меня вот все наоборот wink.gif

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
CoopeR
Ну теперь я ещё и зарегался на форуме))
спасибо за быстрые ответы)

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 таблица с комментариями
выводит на главной превьюшку статьи и количество комментов в ней
или мне в запросе перечислять все поля которые мне нужны? вроде все нужны

_____________
Нажимаю "Мой компьютер"... не моет, сукоо...
Познакомлюсь с девушкой, можно крякнутая версия...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.