2012-04-13 3 views
0

Мне интересно, как лучше вставить многомерный массив значений в базу данных - в частности, две таблицы? Я создал следующий цикл Еогеасп, который создает запрос, который будет вставлять все записи в одну таблицу:Вставить PHP-массив в две таблицы MySQL

foreach($newPosts as $value) { 
      if(!isset($postQuery)) { 
       $postQuery = "INSERT INTO posts (primay_key, col1, col2, col3, col4) VALUES ('$value[0]', FROM_UNIXTIME($value[4]), '$value[2]', '$value[1]', '$value[3]')"; 
      } else { 
       $postQuery .= "('$value[0]', FROM_UNIXTIME($value[4]), '$value[2]', '$value[1]', '$value[3]')"; 
      } 
    } 

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

Если я переместил это значение во вторую таблицу, я хочу связать таблицы с primary_key из первой таблицы, которая является значением автоинкремента. Как я прокручиваю этот многомерный массив и вставляю свои данные в обе таблицы, вставляя primary_key первой таблицы во вторую? Я знаю, что могу использовать LAST_INSERT_ID(), если я выполняю каждый запрос по одному за раз. Некоторые обновления будут содержать сотни строк, поэтому я не хочу этого делать.

Заранее благодарен!

+1

«в отдельной таблице, поскольку значение особенно велико». Это не очень хорошая причина. Если это один и тот же тип данных, он должен находиться в одной таблице, хотя вы можете помочь нам судить о ситуации, указав, что именно вы вставляете. Но если вы не укажете столбец в ваших запросах, вы не заметите значительную задержку. Просто держитесь подальше от 'SELECT *', но вместо этого укажите только те столбцы, которые вам нужно выбрать. – GolezTrol

+1

Кроме того, я думаю, вы должны сначала создать простую версию и посмотреть, как она работает. Теперь вы думаете о редизайне базы данных и применении массовых вставок, не пробовав вообще, если простое решение работает достаточно быстро. Преждевременная оптимизация - это корень всего зла, или, по крайней мере, это дает вам много бесполезно сложного, сложнее поддерживать код. – GolezTrol

+0

Можете ли вы показать мне пример массива? –

ответ

0

Я предполагаю, что перемещение его во вторую таблицу увеличит скорость запроса первой таблицы? Это верно?

Не обязательно. Это только будет влиять на производительность

  • если большая колонна индексируется (что маловероятно, поскольку MySQL ограничивает размер индексированных полей)
  • , если ваши запросы обычно делают полное сканирование таблицы
  • , если значение равно нулю в значительной части случаев (более трети)

Как вы говорите, вы теряете преимущества multi-inserts, разбивая его на 2 стола. Таким образом, ваши единственные варианты, как вы полагаете, вставлять одну запись за раз и считывать идентификатор вставки или (с большим количеством сложного кода) использовать генератор последовательности и предустанавливать множественные идентификаторы записей.

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