В PHP, сколько вызовы DB на страницу хорошо?

Правильный ответ: вы не должны делать это. Это неопределенное поведение, и оно нарушает многие предположения, сделанные компилятором при компиляции вашей программы.

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

unsafe fn very_bad_function(reference: &T) -> &mut T {
    let const_ptr = reference as *const T;
    let mut_ptr = const_ptr as *mut T;
    &mut *mut_ptr
}

По сути, вы конвертируете постоянный указатель в изменяемый, а затем превращаете изменяемый указатель в ссылка.

Вот один из примеров того, почему это очень небезопасно и непредсказуемо:

fn main() {
    static THIS_IS_IMMUTABLE: i32 = 0;
    unsafe {
        let mut bad_reference = very_bad_function(&THIS_IS_IMMUTABLE);
        *bad_reference = 5;
    }
}

Если вы запустите это ... вы получите ошибку. Что случилось? По сути, вы аннулировали правила памяти, пытаясь записать в область памяти, которая была помечена как неизменяемая. По сути, когда вы используете такую ​​функцию, вы нарушаете доверие, которое компилятор оказал вам, чтобы не связываться с постоянной памятью.

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

Короче говоря: не пытайтесь обмануть контролера заимствований. Это там по причине.

РЕДАКТИРОВАТЬ: В дополнение к причинам, которые я только что упомянул, почему это неопределенное поведение, еще одна причина - нарушение правил наложения ссылок. То есть, поскольку вы можете одновременно иметь как изменяемую, так и неизменяемую ссылку на переменную, это вызывает массу проблем, когда вы передаете их отдельно в одну и ту же функцию, что предполагает, что неизменяемые и изменяемые ссылки уникальны. Прочитайте эту страницу из документации Rust для получения дополнительной информации об этом.

11
задан Tomalak 16 December 2008 в 12:18
поделиться

9 ответов

Это действительно зависит от Вашего (дб) установка серверов. Попытайтесь кэшировать большую часть информации как возможную и уменьшить вызовы дб до минимума. База данных будет (почти в каждом случае) быть узким местом Вашего сервиса - выше использование Вашего сайта. Так независимо от того, что Вы стараетесь избегать fireing запрос как будто не действительно необходимый.

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

7
ответ дан 3 December 2019 в 09:42
поделиться

Я сказал бы, что это зависит от загрузки сервера. Если у Вас есть 1 посетитель в минуту, то вызовы на 1-10 дб на страницу были бы очень хорошо. Если Ваша загрузка сервера выше, чем это, скажите запросы на 10 страниц в секунду, то необходимо полагать, что кэширование минимизирует нагрузку на сервер дб.

4
ответ дан 3 December 2019 в 09:42
поделиться

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

1
ответ дан 3 December 2019 в 09:42
поделиться

Когда я работал над проектом www.boxman.com в буме .com, у них был один веб-сайт, который появился как 9 различных сайтов языка/страны под различными доменами. Каждую часть текста вытянули от DB, а также обычных вещей как продукты и т.д... Каждая страница обычно включала бы 200 нечетных запросов DB, но главным образом возврат единственного идентификатора, строковой комбинации. У нас было 100 из пользователей в системе за один раз.

DB выполнил DB2 SQL на 16 путях поле RS6000 unix. Это, вероятно, equivient к современному дню Четырехъядерное поле Intel на 3 ГГц.

Система работала..., поскольку объемы взяли, я реализовал кэш, который включил запись, что синхронизация обрабатывает, который переместил данные, которые были статичны ежедневно к диску веб-сервера, таким образом, это больше не поражало DB.

В основном я сказал бы, хорошо ли производительность затем, это хорошо! но необходимо допускать расширяющийся спрос и быть готовы к нему, когда это происходит.

2
ответ дан 3 December 2019 в 09:42
поделиться

Какой длины часть строки? Какой длины участки человека должны быть? Сколько запросов DB необходимо сделать на загрузке страницы?

Нет никакого единственного ответа. Очевидно, создание ненужных запросов является плохой идеей. Запуск чрезмерных соединений с БД еще хуже. Кэширование неизменных значений хорошо. Кроме того, Вы не можете действительно произвольно сказать, что "Необходимо только использовать запросы $N" на странице - она зависит от того, что Вы пытаетесь сделать и каковы Ваши цели производительности.

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

В словах Donald Knuth "Мы должны забыть о маленькой эффективности, сказать приблизительно 97% времени: преждевременная оптимизация является корнем всего зла". Все говорят о 'масштабируемости' как, они действительно собираются быть следующим Твиттером, но, в действительности, если Твиттер сфокусировался на том, чтобы быть столь же большим, как они теперь, они, вероятно, никогда не получали бы продукт снаружи во-первых.

1
ответ дан 3 December 2019 в 09:42
поделиться

Другой важный вопрос за исключением кэширования должен использовать подготовленные операторы. При выполнении запроса дб должен 1) проанализировать запрос и 2) выполнить его. При использовании подготовленных операторов дб может кэшировать план запросов, он использовал прошлый раз, таким образом, каждый запрос будет меньшей нагрузкой на DBMS. Не включайте загрузку, сколько запросов Вы выполняетесь, но сколько напряжения Вы ставите DBMS. Выполнение 100 подготовленных запросов может быть быстрее, чем выполнение 50 запросов, сгенерированных для данного случая в коде.

0
ответ дан 3 December 2019 в 09:42
поделиться

Один или меньше является всегда лучшим. Два обычно слишком многие.

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

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

-4
ответ дан 3 December 2019 в 09:42
поделиться

Не забывать

  1. используйте сохраненный procs - они работают быстрее.
  2. выполните их в новом - один раз в неделю. (база данных оптимизирует сохраненный procs использование его текущего состояния. Если это изменится затем, то процесс хранилища прекратит быть optimial).
  3. используйте команды как "план выставки" для реального понимания то, что SPS делают.
  4. Сохраненный procs может возвратить несколько наборов данных (таблицы данных), это сокращает сетевой трафик. Сохраненный proc сингла может сделать несколько вещей.

Tony

-1
ответ дан 3 December 2019 в 09:42
поделиться

помните, что запросы на 100 000 страниц - только что более чем 1 секунда более чем 24 часа. Пока они все не запрашивают сразу.

0
ответ дан 3 December 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: