Производительность базы данных с зацикленными запросами на обновление? - PullRequest
0 голосов
/ 02 октября 2010

В настоящее время я структурирую свои запросы для модели обновления базы данных с помощью CodeIgniter.

Я получаю в форме опубликованные ключи ввода с $keys = array_keys($_POST)

Для обновления в соответствии с полями базы данных, которые я хотел сделатьчто-то вроде этого

foreach($keys as $key){
    $data = $this->input->post($key);
    $this->db->query("Update $table SET '$key'='$data' WHERE user_id='$the_user->id'");  }

(это не рабочий код, я просто пытаюсь проиллюстрировать мой вопрос, следовательно, нет экранирования, проверки и т. д.)

У меня вопрос, ставит ли этопроблема с производительностью, запустив отдельный запрос для каждого отдельного фрагмента данных формы?

РЕДАКТИРОВАТЬ: извините, не хотел, чтобы это звучало как вопрос да или нет, очевидно, если да или нет, ответда, но я ищу больше, в какой степени это мешает производительности?

1 Ответ

0 голосов
/ 02 октября 2010

Да.

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

Вы можете попробовать:

  1. построить строку SQL перед отправкой:

    UPDATE <table> SET key1=data1, key2=data2, key3=data3 WHERE user_id=<user>
    
  2. выполнение нескольких обновлений в одной транзакции:

    $this->db->query("
        UPDATE <table> SET key1=data1 WHERE user_id=<user>;
        UPDATE <table> SET key2=data2 WHERE user_id=<user>;
        UPDATE <table> SET key3=data3 WHERE user_id=<user>;"
    );
    

Я не уверен, как PHP / MySQL обрабатывает второй вариант.Perl / Postgres может сделать это.Кроме того, я думаю, что первый вариант будет быстрее.

Еще одна вещь, которую следует учитывать, если вы делаете это для нескольких пользователей, - это использовать IN (например, WHERE user_id IN ($user_list), где $ user_listэто строка пользователей в формате 'user1','user2','user3').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...