2009-10-20 2 views
0

Я занимаюсь разработкой сайта, и у меня есть некоторые сомнения относительно наилучшего подхода к базе данных. В общем, когда я загружаю страницу, из базы данных нужно извлечь несколько данных. Я не уверен, что я делаю это наилучшим образом. Так прямо сейчас, и в качестве примера я называю следующие функции при отображении страницы:Производительность с php и mysql

(...) 
(a) -> getAuthorName()   // 1 db connection - 1 db query 
(b) -> getAuthorLocation()  // 1 db connection - 1 db query 
(consider that here it could come more info the author....) 

(...) 
(c) count<- countNumberBooks() // 1 db connection - 1 db query 
(d) if(count == 0) 
(e)//do something 
else 
(f) books<- getBooksByAuthor() // 1 db connection - 1 db query 
(g) renderBooks... 

Учитывая этот пример, мои вопросы:

  1. Является ли это лучше сделать (а) и (б) в одной единственной функции, чтобы иметь только 1 запрос к базе данных?
  2. Лучше ли делать (f), считать результат, а затем либо делать (e), либо (g), и таким образом избавиться от (c)?
  3. Или, лучше ли загружать все, что нам нужно из базы данных за один шаг в начале, извлекать данные в какую-то структуру, а затем читать их при рендеринге страницы?

Спасибо!

+0

Стандартный ответ: Это, вероятно, зависит от того, куча вещей. Попробуйте профилировать свой код - насколько быстро различные возможности выполняются под одним пользователем? Попробуйте загрузить ваш код - какая разница, если вы получаете сотни запросов в секунду? –

ответ

0

Некоторые быстрые ответы:

1) Да, это лучше извлекать как можно больше данных из одной строки, когда вы можете, а не разделить ее.

2) это зависит немного больше, если вы всегда собираетесь использовать данные, которые вы извлекаете, тогда лучше их получить, и сделать счет в php.

3) это немного сложный, чтобы иметь общий ответ, вы можете захотеть взглянуть на какой-то ОРМ.

1

Вы должны проверить и измерить, так как она будет зависеть от всех видов факторов, о вашем сервере, вашей базы данных схемы и т.д. и т.д.

Однако, если вы не публикуете на сайт, который является ультра ультра занят, реальный ответ в том, что это просто неважно. Независимо от того, какое решение проще в обслуживании, и если вы начинаете видеть, что проблема связана с вашим сайтом, проконсультируйтесь с ним, чтобы узнать, в чем проблема.

0

Это может не полностью ответить на ваш вопрос, но при этом быть полезным: я бы предпочел сделать «SELECT * FROM authors WHERE id = $ author_id» и получить результат как объект (mysql_fetch_object (..)). Таким образом, вы можете обратиться к любому автору данных, вам может понадобиться, не делая новый SQL-запрос каждый раз, когда:

$sql = "SELECT * FROM authors WHERE id = $author_id"; 
$sth = mysql_query($sql); 
if ($author_obj = mysql_fetch_object($sth)) { 
    echo "Author name: " . $author_obj->name; 
} 

и т.д ...

0

В целом, для повышения производительности лучше получить дополнительную информацию из базы данных за меньшее количество запросов. Однако в некоторых случаях это приводит к повторному использованию кода и поддержке, поэтому вам придется сделать компромисс.

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

Что вы, безусловно, не должны делать, это иметь петлю запросов. Но просто выдавать довольно много (может быть, 100) простых одноразовых запросов, не так уж плохо, особенно если ваша база данных имеет низкую задержку, и ваши страницы не попадают слишком часто.

Все запросы, которые вы делаете вопрос, вероятно, следует использовать такое же соединение, как подключение к базе данных довольно дешево, но не бесплатно (в частности, он требует другого туда-обратно)

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