[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запросы и вывод из БД
blade
Очередной раз писал что-то типа новостей для сайта , столкнулся с тем что что на вывод и проверку информации шло 3 запроса
1) Проверял не истек ли срок давности
2) Проверял сколько еще активных записей
3) Выводил саму информацию исходя из результатов первых 2 показателей причем выводил каждй раз что-то новое т.е рандомные записи

но тут я решил что это не дело и переделал код в 1 запрос.

<?php
$textob = array();
$linkob = array();
$numob = "0";

$resultob = mysql_query("SELECT * FROM tb_text");
if (mysql_num_rows($resultob) > 0)
{
while($rowob = mysql_fetch_array($resultob))
{
if (strtotime($rowob['posldate']) < time())
{
mysql_query("DELETE FROM tb_text WHERE id = '".$rowob['timer']."' and status = '0'");// Удаляю запись
}
if (strtotime($rowob['timer']) < time())
{
mysql_query("DELETE FROM tb_text WHERE id = '".$rowob['timer']."'");// Удаляю запись
}
if ($rowob['status']!='0')
{
$numob++;
$textob[$numob] = $rowob["text"];
$linkob[$numob] = $rowob["link"];
}
}


$numofob = count($textob);
$randomob = rand(1,$numofob);

if ($textob[$randomob]!='')
{
echo "<small>$textob[$randomob]</small> <a href=\"$linkob[$randomob]\" target=\"_blank\">Перейти >></a>";
}
}

?>


Хотел бы устлышать на сколько это оптимальный код ?
можно ли так вообще писать код?
или лучше всетаки использовать 3 запроса нежели 1 такой для повышения быстродействия выполнения?
ЗАРАНЕЕ СПАСИБО



Спустя 2 часа, 39 минут, 28 секунд (27.09.2010 - 11:22) blade написал(а):
ну так кто нить наставит меня на пусть истиный ?! smile.gif

Спустя 14 минут, 2 секунды (27.09.2010 - 11:36) inpost написал(а):
blade
А ты запускал? Работает скрипт? =))) Я про грамматические ошибки

Спустя 15 минут, 50 секунд (27.09.2010 - 11:52) blade написал(а):
ну да работает. просто сидел с другого компа и писал по памяти мож и допустил где но грамматика сейчас меня пока не интересует а интересует сам код можно ли так использовать или все же лучше 3 запроса ?!

Спустя 6 минут, 32 секунды (27.09.2010 - 11:58) inpost написал(а):
blade
А почему нет? Если всё работает, на первый взгляд (хоть и слипаются глаза...) кажется, что всё написано правильно. Сделай несколько проверочных запросов, убедишься, что всё работает.
Хотя нет... ты делаешь основную глупость, тебе не нужно указывать цифры:
// Пишешь:
$arr[] = "aaaa";
$arr[] = "bbbb";
$arr[] = "cccc";

// В итоге ты получишь:
$arr[0] == "aaaa";
$arr[1] == "bbbb";
$arr[2] == "cccc";

Спустя 4 минуты, 35 секунд (27.09.2010 - 12:03) blade написал(а):
спасибо за ответ а то думал что так лучше не писать что будет хуже работать чем 3 запроса

Спустя 2 минуты, 2 секунды (27.09.2010 - 12:05) inpost написал(а):
blade
Чем меньше запросов к БД, тем лучше. Ты сокращаешь нагрузку на БД, а значит она сможет выдержать куда больше народу.

Спустя 4 минуты, 49 секунд (27.09.2010 - 12:10) blade написал(а):
общался тут с одним человеком он говорит что можно весь сайт написать всего в 1 запросе реально ли это ?!

Спустя 8 минут, 57 секунд (27.09.2010 - 12:19) DeeKeiD написал(а):
Это скорей непрактично чем нереально laugh.gif

Спустя 1 минута, 1 секунда (27.09.2010 - 12:20) inpost написал(а):
blade
Можно, но это полный бред. 1 запрос подразумевает взять всю информацию из базы данных за раз, но смысл человеку загружать всю БД, если он, возможно, сразу и выйдет, или это бот, или куда реальнее, он просто пройдет часть сайта.
Идея такова, если человеку что-то надо, мы ему даём именно это, не больше!

Спустя 2 часа, 55 минут, 50 секунд (27.09.2010 - 15:15) Ice написал(а):
Brain initialization started
Brain initialization completed
Debug started...
Цитата (blade @ 27.09.2010 - 09:42)
$numob = "0";
Судя по продолжению кода, это - число. Так зачем его в кавычки брать?



  • Цитата (blade @ 27.09.2010 - 09:42)
    while($rowob = mysql_fetch_array($resultob))
    С точки зрения оптимизации - лучше либо mysql_fetch_assoc, либо mysql_fetch_array($query, MYSQL_ASSOC). Уже много раз объяснял почему.



  • Цитата (blade @ 27.09.2010 - 09:42)
    and status = '0'
    Поле status наверняка должно быть целочисленным, а не таким, какое оно сейчас.



  • Цитата (blade @ 27.09.2010 - 09:42)
    id = '".$rowob['timer'].

    смотри предыдущий пункт



  • Цитата (blade @ 27.09.2010 - 09:42)
    $rowob['status']!='0'
    --"--"--"--



  • Цитата (blade @ 27.09.2010 - 09:42)
    $randomob = rand(1,$numofob);
    Более "крутой аналог - mt_rand" - случайность лучше рассчитанаDebug completed...

    Спустя 6 минут, 38 секунд (27.09.2010 - 15:22) blade написал(а):
    Ice чесно мало что понял из Вашего поста huh.gif

    Спустя 12 минут, 29 секунд (27.09.2010 - 15:35) Ice написал(а):
    тонкий намек, чтоб я за тебя переписал? biggrin.gif

    Спустя 14 минут, 16 секунд (27.09.2010 - 15:49) inpost написал(а):
    blade
    Айс достаточно просто объяснил ошибки)

    Спустя 3 минуты, 36 секунд (27.09.2010 - 15:52) blade написал(а):
    нет за меня пистаь ненужно нужно рассталковать я хочу сам понять все чтоб в будущем не повторять таких ошибок

    Спустя 4 часа, 49 минут, 42 секунды (27.09.2010 - 20:42) Ice написал(а):
    По-моему, я растолковал. Спрашивай чего непонятно, раздуем немного темку.

    Спустя 3 часа, 4 минуты, 18 секунд (27.09.2010 - 23:46) SlavaFr написал(а):
    blade 2 запроса
    1)случайная строчка:
    SELECT * FROM tb_text order by rand() limit 1;

    2)удаления:
    DELETE FROM tb_text where (posldate<UNIX_TIMESTAMP() and  status = '0') or timer<UNIX_TIMESTAMP();

    Спустя 2 минуты, 10 секунд (27.09.2010 - 23:49) Ice написал(а):
    @ SlavaFr
    Но тогда эти запросы не будут кэшироваться, если я не ошибаюсь, что приведет к уменьшению быстродействия.

    Спустя 17 минут, 53 секунды (28.09.2010 - 00:07) SlavaFr написал(а):
    @ice
    Цитата
    Поле status наверняка должно быть целочисленным, а не таким, какое оно сейчас.

    это все спекуляция чистой воды smile.gif
    Цитата
    Но тогда эти запросы не будут кэшироваться, если я не ошибаюсь, что приведет к уменьшению быстродействия.
    рррррр перед delete? biggrin.gif
    от: а если честно, то неоднократно приходилось отказыватся от кеша из за того, что запросы в базе на индексированные строчки проходят быстрее чем поиск и открытие файла в папке с мусором где 1000 файлов валяется.


    Спустя 3 минуты, 32 секунды (28.09.2010 - 00:10) inpost написал(а):
    Собаководы... надо так: @-ice . Собачка должна быть на поводку!!

    Спустя 3 минуты, 14 секунд (28.09.2010 - 00:13) SlavaFr написал(а):
    @-inpost ты что собаку от жирафа отличить не можеш biggrin.gif
    A тебе не слабо по репутации настучали biggrin.gif

    Спустя 3 минуты, 47 секунд (28.09.2010 - 00:17) inpost написал(а):
    SlavaFr
    Моя подпись: "Хотите отблагодарить меня - ставьте МИНУС!!!"
    Вот откуда репутация такая, (кроме двух тролей). Теперь я хаотично-нейтральный по d&d системе)

    Спустя 7 минут, 53 секунды (28.09.2010 - 00:25) Joker написал(а):
    Цитата (inpost @ 27.09.2010 - 14:05)
    Чем меньше запросов к БД, тем лучше. Ты сокращаешь нагрузку на БД, а значит она сможет выдержать куда больше народу.

    пример расскажу про такое.

    нужно мне было сделать экспорт данных на MySQL примерно 400 отчетов, каждый отчет формируется из 5-11 запросов к базе, сделать нужно было единым выполнением скрипта, скрипт мог выполнятся хоть всю ночь но задача была поставленна чтоб за один присест так скажем, если подключить сюда нетрудную математику то пришлось бы выполнить 2000-4400 запросов, ну само сабой разумеется MySQL сразу падал, в итоге пришлось консультироваться с БД'шником и писать ~40 сложениших запросов и переносить часть логики в бд, в результате эти ~40 запросов выполнялись порядка 3 часов но MySQL не падал зато)

    Спустя 6 минут, 21 секунда (28.09.2010 - 00:31) Ice написал(а):
    Цитата (SlavaFr @ 28.09.2010 - 01:07)
    это все спекуляция чистой воды

    тем не менее глаза режет wink.gif

    Спустя 16 минут, 56 секунд (28.09.2010 - 00:48) SlavaFr написал(а):
    @Ice a если это просто
    status enum('0','1') ?

    @Joker Я накалякал один прекрассный опрос из 14 join i okolo 8 subquery и радовался что улажился в один запрос. запустили скрипт и оказалось что для 130 строчек резултата ушло 47 часов времени. 100 раз проверяли индексы, 100 раз смотрели explain . просто на определенном этапе он плюет на клучи и индексы наченает искать по непонятным темп таблицам. разбил запрос на 3 части и именно так как отговариваем других здесь делать и окозалось что скрипт все делает за 3 минуты.
    Ты прав, что нельзя все под одну гребенку чесать, но в данном приметивном случае действительно не стоит делать дополнительных запросов хотябы чтоб писанину экономить smile.gif .

    все надо прекращать базары в этой теме, нето тигр нападет smile.gif

    Спустя 5 минут, 26 секунд (28.09.2010 - 00:54) Ice написал(а):
    Цитата (SlavaFr @ 28.09.2010 - 01:48)
    @Ice a если это просто
    status enum('0','1') ?

    а если нет? wink.gif

    Спустя 3 минуты, 4 секунды (28.09.2010 - 00:57) inpost написал(а):
    Joker
    А если не секрет, что именно высчитывалось так долго и много?

    Спустя 30 минут, 5 секунд (28.09.2010 - 01:27) Joker написал(а):
    отчеты, я же написал, тема макроэкономика, чуть мозг мне не порвали терминами.
    квартальные, полугодовые, годовые.

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

    Спустя 8 часов, 58 минут, 11 секунд (28.09.2010 - 10:25) blade написал(а):
    Я до конца так и не понял все таки какой код лучше мой или товарища SlavaFr -а в плане оптимизации ?
    а то слишком уж большая нагрузка идет в 3 запросах при онлайне больше 50 человек

    Спустя 1 час, 5 минут, 49 секунд (28.09.2010 - 11:31) SlavaFr написал(а):
    можеш спокойно мои запросы использовать, так как дискусии по поводу кеша по настоящему не косались твоей проблемы. В любом случае на когда не помишает сравнить на скорость оба варианта.

    Спустя 48 минут, 38 секунд (28.09.2010 - 12:19) inpost написал(а):
    blade
    50 человек онлайн - это копейки) Вот когда будет 2 000 минимум, тогда и столкнёшься с проблемой оптимизации соединений.

    Спустя 27 минут, 51 секунда (28.09.2010 - 12:47) blade написал(а):
    да но на страницах есть же и другие запросы помимо этих

    Спустя 25 минут, 27 секунд (28.09.2010 - 13:13) SlavaFr написал(а):
    уже зделал? когда закончиш покажиш.

    Спустя 45 секунд (28.09.2010 - 13:14) blade написал(а):
    кого ?

    Спустя 35 секунд (28.09.2010 - 13:14) SlavaFr написал(а):
    запросы, которые я тебе написал

    Спустя 19 минут, 27 секунд (28.09.2010 - 13:34) SlavaFr написал(а):
    Если не ошибся, то можеш заменить весь твой участок этим кодом
    $resultob = mysql_fetch_assoc(mysql_query("SELECT * FROM tb_text where status<>'0' order by rand() limit 1"));
    mysql_query("DELETE FROM tb_text where (posldate<UNIX_TIMESTAMP() and status = '0') or timer<UNIX_TIMESTAMP()");
    if(is_array($resultob) && isset($resultob['text']) && $resultob['text']!=''){
    echo "<small>$resultob['text']</small> <a href=\"$resultob['link']\" target=\"_blank\">Перейти >></a>";
    }

    k стате ты так и не сказал какого типа у тебя status. если не enum и не set, то измени запросы так, чтоб кавычек вокруг 0 небыло.

    Спустя 13 минут, 32 секунды (28.09.2010 - 13:47) blade написал(а):
    варчар тип поля статус

    Спустя 2 минуты, 25 секунд (28.09.2010 - 13:49) Ice написал(а):
    SlavaFr
    я отчасти был прав wink.gif

    Спустя 1 минута, 46 секунд (28.09.2010 - 13:51) blade написал(а):
    Я пока не дома поэтому немогу проверить но суть такова

    Имеется база с данными из нее должен выводится текст и рядом ссылка только если статуст (status) не равен 0 т.е одобрено, если срок в нашем случае берется дата размещения + количество дней и если сумма больше нынешнего времени то удаляем запись с БД, если в течении 24 часов с момента размещения не одобрена удаляем тоесть дата размещения + 24*3600 > чем нынешнее время тоже удаляем ну а все что подходит под такие условия выводим рандомно лимитом в 1 запись

    Спустя 1 минута, 9 секунд (28.09.2010 - 13:52) blade написал(а):
    Цитата (Ice @ 28.09.2010 - 10:49)
    SlavaFr
    я отчасти был прав wink.gif

    а какой тип поля применять к такому типу если там хранится только 1 или 0 ?!

    Спустя 1 минута, 29 секунд (28.09.2010 - 13:54) Ice написал(а):
    Цитата (blade @ 28.09.2010 - 14:52)
    а какой тип поля применять к такому типу если там хранится только 1 или 0 ?!

    ENUM или SET

    Спустя 40 минут, 9 секунд (28.09.2010 - 14:34) SlavaFr написал(а):
    до varchar я действително не догадался smile.gif , но в любом случае кавычки убирать не надо smile.gif

    Спустя 1 месяц, 2 дня, 19 часов, 43 минуты, 7 секунд (31.10.2010 - 11:17) blade написал(а):
    Искал тему по форуму но так и не нашёл подходящюю, и дабы не создавать еще 1 тему решил задать вопрос в этой!

    Как можно сделать чтоб все сообщения (доска сообщений) выводились не сверху вних а снизу страницы к вверху ?

    Спустя 32 минуты, 48 секунд (31.10.2010 - 11:50) inpost написал(а):
    blade
    Для таких вопросов надо писать новую тему, никто ругать не будет.
    В обратном порядке надо добавить DESC.
    "SELECT * FROM `table` ORDER BY `id` DESC"
    Быстрый ответ:

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