2013-03-12 2 views
1

Мне интересно, есть ли способ сделать то, что я делаю более эффективно. Прямо сейчас у меня есть класс, который извлекает статусы из базы данных. Это довольно просто и не должно сильно влиять на производительность.Запрос внутри цикла for

public function get ($var1, $var2, $var3) 
{ 
    $feed = array(); //Initialize an empty array 
    //Query the database 
    $Statement = $this->Database->prepare("SELECT id, name, excerpt, post, timestamp, tags, title FROM posts WHERE col1 = ? AND col2 = ? AND col3 = ? ORDER BY id DESC LIMIT 15"); 
    $Statement->execute(array($var1, $var2, $var3)); 

    while($row = $Statement->fetch(PDO::FETCH_ASSOC)) 
    { 
     $posts[] = array("id" => $row["id"], /*etc...*/); 
    } 

    return $posts; 
} //end get 

И тогда моя страница настроить что-то вроде этого, которое я знаю, не эффективен на всех:

<?php for ($count = 1; $count <= $total; $count++): //Display the calendar  
    echo $count;    
    $feed = $Feed->get($count, $total, $var3); 

    foreach ($feed as $post): 
     echo $post["id"];   
    endforeach; 
endfor; ?> 

Я надеюсь, что имеет смысл. Там гораздо больше html брошено туда и всего. Сейчас в моей базе данных всего 18 строк, и для загрузки страницы требуется 10 секунд. Что действительно плохо. Я должен настроить его таким образом из-за дизайна сайта. Таким образом, цикл foreach должен находиться внутри цикла for, потому что все это настроено как календарь.

Вопрос в том, будет ли более эффективным выбирать все строки, сохранять их вне цикла for, а затем работать с этим массивом или лучше запускать каждый запрос внутри цикла foreach так, m делать это сейчас (я много читал и знаю, что большинство людей говорят, что это огромный нет нет). И какие проблемы я бы натолкнулся, если бы использовал прежний вариант, и в базе данных было указано около миллиона строк.

Надеюсь, это имеет смысл. Я обновлю вопрос, если это не так. Прямо сейчас, хотя около 30 запросов делаются только для доступа к 1 или 2 строкам. Но единственный вариант, который я мог бы придумать, - это выбрать все строки в таблице, а затем работать с этим массивом, но если вы делаете вид 1 миллион строк в db, я чувствую, что это повлияет на производительность намного больше.

Я прав, и какие решения? Спасибо

+4

Не ответ, но могу ли я просто упомянуть, как приятно (на этот раз) использовать PDO (с подготовленными операторами) вместо 'mysql_ *'. – h2ooooooo

+0

Как правило, лучше ограничить количество запросов на db. Каждое взаимодействие с БД занимает решающие миллисекунды ... но вам также нужно балансировать это с количеством бродячих данных, которые вы будете проходить через ваш сокет, чтобы получить более обобщенный запрос. Также +1 для использования PDO (и +1 к комментарию PDO тоже: P) –

+0

@ Дайте, что бы вы сказали, это ограничение на количество блуждающих данных, которые я бы сохранил в массиве. Потому что я мог выбирать все должности за несколько месяцев, и я думаю, что это то, что я собираюсь делать, но в том, что такое пуайш, этот вариант меня не подводит, а не запрашивает именно то, что мне нужно для каждого дня. Итак, какова точка опроса слишком большого количества запросов или слишком много бродячих данных? и спасибо h2ooooo – Alex

ответ

0

Я просто хочу указать, что я действительно решил проблему. Если кто-то задается вопросом, почему цикл foreach запрашивал так сеять, это было потому, что я случайно удалил строку, где я каждый раз подключался к Facebook api внутри цикла foreach каждый раз, чтобы собрать информацию о плакате. Поэтому, если кто-нибудь когда-нибудь споткнется на этот вопрос, просто чтобы убедиться, что хочу уточнить, что многие вызовы facebook-> api - это плохо. сохраните информацию в своей базе данных и запросите ее.

Смежные вопросы