один запрос или несклоко? (оптимиз)
1.
Александр (05.02.2010 / 00:44)
вообщем у меня такой вопрос. что лучще, несколько запросов, или один. к примеру, у меня на главной, счётики для гости, форума, обмена и тд. я составил такой запрс:
___
SELECT COUNT(*) as `upload_count`,
SUM(`size`) as `upload_size`,
(SELECT COUNT(*) FROM `upload` WHERE `day` = ".date("d.m.y",time())." AND `type`='file') as `upload_new`,
(SELECT COUNT(*) FROM `users`) as `users_count`,
(SELECT COUNT(*) FROM `guest`) as `guest_count`,
(SELECT COUNT(*) FROM `achat`) as `achat_count`,
(SELECT COUNT(*) FROM `quotes` WHERE `mod` = 1) as `quotes_count`,
(SELECT `time` FROM `news` ORDER BY `id` DESC LIMIT 1) as `news_time`,
(SELECT `id` FROM `news` ORDER BY `id` DESC LIMIT 1) as `news_id`,
(SELECT `text` FROM `news` ORDER BY `id` DESC LIMIT 1) as `news_text`,
(SELECT COUNT(*) FROM `forum` WHERE `type` = 'themes') as `forum_themes`,
(SELECT COUNT(*) FROM `forum` WHERE `type` = 'massage') as `forum_massage` FROM `upload` WHERE `type` = 'file'
---
так вот, лучше разделить его, или оставить как есть?
2.
Артур (05.02.2010 / 02:43)
Один запрос естественно лучше, а вообще, сугубо относительный вопрос
3.
Олег (05.02.2010 / 03:53)
2, чем же? В данном случае создается временная таблица, и сложность запроса увеличивается.
4.
ramzes (05.02.2010 / 03:58)
А не лучше для этого шаблон использовать бредет?
Не очень силен но вроде они как раз для повторяющихся схожих запросов и создавались..
5.
Артур (05.02.2010 / 03:59)
3.
Aligan, не перечитывал код, просто ответил на вопрос о количестве запросов, так что не знаю что "В данном случае"
6.
Олег (05.02.2010 / 20:06)
ramzes, причем тут шаблоны-то?))) Они никак не влияют на результ выборки)
7.
ктулху (05.02.2010 / 20:15)
Лучше уж грузить мускул чем PHP скрипт, мускул хоть можно на отдельный сервер вынести
8.
Олег (05.02.2010 / 20:51)
7, лучше писать запросы по отдельности, либо использовать LEFT JOIN. Но я бы в данном случае советовал использовать несколько простых запросов. Один многотабличный запрос нужен там где результат выборки запроса из одной таблицы зависит от другой одной или несколько связующих таблиц.
9.
ramzes (06.02.2010 / 01:17)
#6, они влияют на скорость выполнения запроса, при чем тут результаты, я о них ни чего не говорил?
Ладно проехали.
10.
Александр (06.02.2010 / 04:20)
ну а если, примерно такой запрос, использовать с циклом, то есть было так:
(запрос)
while()
{
(запрос)
(запрос)
}
я сделал так:
(запрос, запрос, запрос)
while()
{
вывод
}
так лучше?
11.
Вантуз-мен (06.02.2010 / 04:37)
10.
Александр, не в том направлении копаете, я так понимаю вы в цикле хотите проверять какие-либо данные из бд, не лучше ли эти данные (точнее результаты данных) иметь уже там чтобы выводить их одним запросом.
Можно пойти другим путем и кэшировать все все результаты в обычный файл
12.
Александр (06.02.2010 / 05:34)
не, у меня к примеру в обменике, вывод категорий, сколько там файлов, и вес категории,
что бы не делать так:
(запрос на вывод категорий)
цикл(
(запрос на к_во файлов, аля вере пид = $array[id])
(запрос на вес файлов, аля вере пид = $array[id])
)
а сделать это в одном запросе ещё до цикла, типа
SELECT a.`name`, a.`id`, a.`ext`,
(SELECT COUNT(b.`id`) FROM `upload` b WHERE b.`type` = 'file' AND b.`refid` = a.`id`) as `count_all`,
(SELECT SUM(c.`size`) FROM `upload` c WHERE c.`type` = 'file' AND c.`refid` = a.`id`) as `size_all` FROM `upload` a WHERE a.`type` = 'dir' ORDER BY a.`name` ASC
так же лучше будет?
13.
Александр (21.02.2010 / 21:54)
Лучше делать подзапросами.Нечего ещё раз запрос посылать и чтот делать... подзапросом быстрее будет.
14.
Анатолий (25.02.2010 / 15:29)
ТС, лучше запрос, запрос, зпарос, а для упрощения сделай образ (VIEW) в самой БД, так легче код воспринимать
;
15.
ктулху (25.02.2010 / 15:50)
Кстати, а почему бы не проверить на практике? нагенерировать к примеру 10000 записей и проверить как быстрее =) чистый профит же
16.
Олег (25.02.2010 / 16:52)
15, Это ничего не даст. Нужно хотя бы учитывать еще и число одновременных подключений к БД.
14, в данном случае если создать представление (view), то оно будет работать только по алгоритму TEMPTABLE, тоесть будет создаваться временная таблица, поэтому значимого результата не добьется.
URL:
https://visavi.net/topics/5730